使用insert... on duplicate key update时,更新多列的语法是什么?
INSERT INTO table1 (col1, col2, col3, col4) VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
ON DUPLICATE KEY UPDATE col2=‘$val2’, col3=‘$val3’, col4=‘$val4’ // <-- not sure
更新:我在PHP中使用它。由于这是一个语法问题,因此非常相关。
$result = mysql_query("INSERT INTO table1 (col1, col2, col3, col4)
VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
ON DUPLICATE KEY UPDATE (col2=‘$val2’, col3=‘$val3’, col4=‘$val4’)")
同样,不确定最后一部分是否有“更新”。
答案 0 :(得分:32)
INSERT INTO table1
(`col1`, `col2`, `col3`, `col4`)
VALUES
('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
`col2`='val2',
`col3`='val3', [...]
我修改了你的引号和标记。
修改强>
在PHP中:
$result = mysql_query("
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('" . $val1 . "', '" . $val2 . "', '" . $val3 . "', '" . $val4 . "')
ON DUPLICATE KEY UPDATE
col2='" . $val2 . "',
col3='" . $val3 . "',
col4='" . $val4 . "'"
);
请注意,值由单引号'
包围。如果值是数字类型(INT,FLOAT等),则可以删除这些引号。只要您没有使用count
,type
或table
等列名称,就可以在列名称周围使用反引号。
在PHP示例中,字符串连接用于清楚地分离变量。
答案 1 :(得分:23)
嗯,这已经过时了。但是当然你只需要提供一个值一次,没有理由在查询中第二次添加它(这对于多个插入或预处理语句来说很方便):
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
col2=VALUES(col2),
col3=VALUES(col3) [,...]
它具有优势,它仍然适用于多个插入语句:
INSERT INTO table1
(col1, col2, col3, col4)
VALUES
('val1', 'val2', 'val3', 'val4'),
('val5', 'val6', 'val7', 'val8'),
('val9', 'val10', 'val11', 'val12')
ON DUPLICATE KEY UPDATE
col2=VALUES(col2),
col3=VALUES(col3) [,...]
答案 2 :(得分:0)
您的查询似乎是正确的。 以下是此类查询的示例:
INSERT INTO Stat (id, month, year, views, redirects, onList, onMap, emails) VALUE ("' . $Id . '","' . $month . '","' . $year . '",0,0,"' . $data['onList'] . '","' . $data['onMap'] . '",0) ON DUPLICATE KEY UPDATE onList=onList+' . $data['onList'] . ', onMap=onMap+' . $data['onMap']
答案 3 :(得分:0)
为了清晰的语法,还有另一种语法形式;
INSERT INTO `table1` SET `id`=$id,
`col2`='$col2',
`col3`='$col3'[, ...]
ON DUPLICATE KEY UPDATE `col2`='$col2',
`col4`='$col4'[, ...]
实施例
INSERT INTO customers SET cid=10,
createdon=NOW(),
createdby='user',
cname='Steve'
ON DUPLICATE KEY UPDATE modifiedon=NOW(),
modifiedby='user',
cname='Steve';
如果在数据库中不存在ID = 10的客户,则将创建该客户,并且将设置cid,createdon,createdby,cname列。如果它确实存在,那么它将被更新并且修改列,modifiedbym,cname将被更新。
注意#1:如果您在此处输入主键cid = 0,它将触发AUTO_INCREMENT(当然,如果pk列定义为AUTO_INCREMENT)并且将插入记录!
注意#2:ON DUPLICATE KEY UPDATE更新现有的PK ID记录。但是如果在任何UNIQUE KEY列上进行DUPLICATE,它也会进行更新。例如,如果您定义了cname列为UNIQUE,则使用cname =&#39; Steve&#39;保存记录。已经存在的将导致该记录的更新(不是新的INSERT)。请注意这一点,因为您可能希望DB返回UNIQUE KEY约束违规的错误,这在此处不会发生。