如果MySQL中存在,则更新,如果不存在,则插入行


Update if exist, insert row if not exist in MySQL

我在这里提出了类似的问题。。。

带有内部联接的三个表格

但我无法得到足够的答案来解决我的问题,所以我不得不再次提问。。。

我有下表。。。

**

任何想玩这些数据的人都请在这里测试http://sqlfiddle.com/#!9/a0807

**

Table1
IDA    colB    colC    
111       a       w    
222       b       w    
333       c       s        
444       b       g    

Table2
IDB    colB    colC    
11       w       f    
12      w       r    
13      s       g    

Table3
IDA     IDB       
111     11         
222     12           
333     13       
444     14

以下代码将从表1复制或插入到表,但没有问题,但表2的IDB错误(因为表2的ID值应该来自表3的内部联接)

INSERT INTO table2 SELECT * FROM table1 WHERE IDA = 111

但是将所有内容从表1复制到表2,这是错误的。。。

所以,我所做的是…下面的内心连接。。。但不起作用。。

INSERT INTO table2
(SELECT * FROM table1 b 
LEFT JOIN table3 c ON c.IDA = b.IDA  
LEFT JOIN table2 a ON a.IDB = c.IDB)
WHERE IDB = 111

这也不起作用。。。。

但是,我需要的正是。。。我想从表1复制到表,通过表3连接,如果行可用,则更新,如果不插入。。。。

很抱歉问了两次,但我很想从你们那里得到一些想法。。。

请帮忙。。。提前感谢。。。

可能正在使用php,如果可能的话可以处理。。。

尝试使用类似的ON DUPLICATE KEY

$sql = "INSERT INTO `table2` (Col2, Col3) 
VALUES ('val1', 'val2')
ON DUPLICATE KEY UPDATE
Col2='val1', Col3='val2'";

编辑:

INSERT INTO table2 (ColB , ColC)
(SELECT ColB.b,ColC.b FROM table1 b 
    LEFT JOIN table3 c ON c.IDA = b.IDA  
    LEFT JOIN table2 a ON a.IDB = c.IDB
 WHERE IDB = 111
)
ON DUPLICATE KEY UPDATE
ColB = ColB.b   
ColC = ColC.b

并且尽量避免使用mysql_*语句,因为整个ext/mysql PHP扩展提供了所有以前缀mysql_*命名的函数,从PHP v5.5.0起,该扩展已被正式弃用,并且将来将被删除。

还有另外两个MySQL扩展可以更好地使用:MySQLiPDO_MySQL,它们中的任何一个都可以用来代替ext/mysql

使用类似的查询

插入表2(ColB,ColC)从表1中选择ColB,ColC,IDA='111'