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

ste*_*mcl 6 mysql upsert insert-update

我有一张桌子:

CREATE TABLE Students (studentId TEXT PRIMARY KEY, name TEXT);
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO Students (StudentId, name) VALUES ('123', 'Jones');
INSERT INTO Students (StudentId, name) VALUES ('123', 'Jonas');
Run Code Online (Sandbox Code Playgroud)

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

p.c*_*ell 10

试试REPLACE:

REPLACE INTO Students (StudentId, name) VALUES ('123', 'Jonas');
Run Code Online (Sandbox Code Playgroud)

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

  • `REPLACE` 是问题的正确答案。如果该行已经存在,它会强制插入(或者更确切地说是整个替换)。`OR UPDATE` 要求您指定要更新的字段和值 - 这是针对不同问题的不同解决方案。 (2认同)
  • 如果该行不存在会发生什么?那么“REPLACE”会执行正常的“INSERT”吗? (2认同)

ype*_*eᵀᴹ 7

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

INSERT INTO Students
    (StudentId, name) 
  VALUES ('123', 'Jones')
ON DUPLICATE KEY UPDATE
  name = VALUES(name) ;
Run Code Online (Sandbox Code Playgroud)

看到这个答案:插入-忽略-VS-刀片式上重复键更新的之间的差异REPLACE,INSERT ... ON DUPLICATE KEY UPDATE以及INSERT IGNORE.


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


pom*_*axa 5

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

  • 如果您有外键(特别是如果它们在删除时级联),则必须考虑差异. (3认同)
  • 但在这种情况下,您无法确定用户是否是同一个人;但你是对的,你需要了解外键上的级联删除...... (2认同)