10

我有一张桌子:

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

4 回答 4

14

尝试REPLACE

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

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

于 2011-11-07T23:03:35.190 回答
9

您还可以使用以下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了解REPLACE,INSERT ... ON DUPLICATE KEY UPDATEINSERT IGNORE.


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

于 2011-11-07T23:13:12.347 回答
6

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

于 2011-11-07T23:02:48.493 回答
1

我有一个类似的问题,但是表中已经有数据,并且没有外键,所以我的解决方案非常简单:
我添加了一个名为的新列temp_id并将其设为主键,然后删除旧的 ID 列,然后将该temp_id列重命名为id.

于 2018-01-13T19:44:00.383 回答