INSERT INTO table_name(col1, col2, ...)
VALUES (val1, val2, ...)
ON DUPLICATE KEY UPDATE
col1 = expr1,
col2 = expr2,
...;
INSERT INTO table_name(col1, col2, ...)
SELECT ...
ON DUPLICATE KEY UPDATE
col1 = expr1,
col2 = expr2,
...;
DROP TABLE IF EXISTS t;
CREATE TABLE t(id int NOT NULL PRIMARY KEY, val varchar(10));
INSERT INTO t VALUES (1, '一'),(2, '二'),(3, '三');
INSERT INTO t VALUES (1, '壹');
ERROR 1062 (23000): Duplicate entry '1' for key 't.PRIMARY'
INSERT INTO t VALUES (1, '壹')
ON DUPLICATE KEY UPDATE
val = '壹';
id|val|
--|---|
1|壹 |
2|二 |
3|三 |
INSERT INTO t VALUES (1, '壹'), (4, '肆') AS new(id, val)
ON DUPLICATE KEY UPDATE
val = new.val;
SELECT * FROM t;
id|val|
--|---|
1|壹 |
2|二 |
3|三 |
4|肆 |
-- 错误语法
INSERT INTO t
(SELECT 1 AS id, '壹' AS v
UNION ALL
SELECT 4, '肆')
ON DUPLICATE KEY UPDATE
val = v;
-- 正确语法
INSERT INTO t
SELECT * FROM
(SELECT 1 AS id, '壹' AS v
UNION ALL
SELECT 4, '肆') AS s
ON DUPLICATE KEY UPDATE
val = v;
REPLACE INTO table_name(col1, col2, ...)
VALUES (val1, val2, ...);
REPLACE INTO table_name
SET col1 = val1,
col2 = val2,
...;
REPLACE INTO table_name(col1, col2, ...)
SELECT ...;
REPLACE INTO t(id, val)
VALUES (1, '壹'), (4, '肆');
REPLACE INTO t
SET id = 1,
val = '壹';
REPLACE INTO t
SELECT * FROM
(SELECT 1 AS id, '壹' AS v
UNION ALL
SELECT 4, '肆') AS s;
CREATE TABLE test (
id INT NOT NULL AUTO_INCREMENT,
data VARCHAR(64) DEFAULT NULL,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id, ts)
);
REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
SELECT * FROM test;
id|data|ts |
--|----|-------------------|
1|Old |2014-08-20 18:47:00|
1|New |2014-08-20 18:47:42|
原文作者:SQL编程思想;如有侵权,请联系管理员删除。