如果INSERT已经在表中,如何强制INSERT进入具有唯一键的表?

时间:2011-11-07 23:00:07

标签: mysql insert-update upsert

我有一张桌子:

CREATE TABLE Students (studentId TEXT PRIMARY KEY, name TEXT);

如果我想要两次插入学生,我想在表格中插入记录 第二个插入覆盖(更新)第一个记录。

INSERT INTO Students (StudentId, name) VALUES ('123', 'Jones');
INSERT INTO Students (StudentId, name) VALUES ('123', 'Jonas');

这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:8)

尝试REPLACE

REPLACE INTO Students (StudentId, name) VALUES ('123', 'Jonas');
  

REPLACE的工作原理与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。

答案 1 :(得分:6)

您还可以使用 INSERT ... ON DUPLICATE KEY UPDATE 语法:

INSERT INTO Students
    (StudentId, name) 
  VALUES ('123', 'Jones')
ON DUPLICATE KEY UPDATE
  name = VALUES(name) ;

请参阅此回答:insert-ignore-vs-insert-on-duplicate-key-update了解REPLACEINSERT ... ON DUPLICATE KEY UPDATEINSERT IGNORE之间的差异。


但请告诉我们 studentId TEXT PRIMARY KEY 是一个错字。你真的有一个TEXT数据类型的主键吗?名称(studentId)表明它可以是简单的INTINT AUTO_INCREMENT

答案 2 :(得分:5)

如果您使用的是MySql - 只需使用REPLACE而不是INSERT

答案 3 :(得分:0)

很抱歉复活了这个,但我有一个类似的问题,但是有一个表已经有数据,没有外键,所以我的解决方案非常简单 我必须添加一个名为“temp_id”的新列并将其作为主键,然后删除旧的ID列,然后将“temp_id”列重命名为“id”。