我想向数据库表添加一行,但如果存在具有相同唯一键的行,我想更新该行。

例如:

INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);

假设唯一键是ID,在我的数据库中,有一行ID = 1。在这种情况下,我想用这些值更新该行。通常这会给出一个错误。 如果我使用INSERT IGNORE,它将忽略错误,但它仍然不会更新。


当前回答

使用INSERT…关于重复密钥更新

查询:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19

其他回答

只是因为我在这里寻找这个解决方案,但从另一个相同结构的表更新(在我的情况下,网站测试DB到live DB):

INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

正如在其他地方提到的,只有你想要更新的列需要包括在ON DUPLICATE KEY update之后。

不需要在INSERT或SELECT中列出列,尽管我同意这可能是更好的实践。

使用SQLite时:

REPLACE into table (id, name, age) values(1, "A", 19)

前提是id是主键。或者它只是插入另一行。参见INSERT (SQLite)。

使用INSERT…关于重复密钥更新

查询:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19

以防万一,你想保留旧字段(例如:name)。查询将是:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name=name, age=19;

当使用批量插入时,请使用以下语法:

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...