SQL中的REPLACE与INSERT

jcm*_*jcm 16 mysql sql replace

我正在做以下SQL教程:http://sql.learncodethehardway.org/book/ex11.html

在本练习中,作者在第二段中说:

在这种情况下,我想用另一个人替换我的记录但保留唯一ID.问题是我必须在事务中执行DELETE/INSERT以使其成为原子,或者我需要执行完全更新.

任何人都可以向我解释一下UPDATE的问题是什么,我们选择REPLACE而不是UPDATE时?

UPDATE代码:

UPDATE person SET first_name = "Frank", last_name = "Smith", age = 100
    WHERE id = 0;
Run Code Online (Sandbox Code Playgroud)

这是REPLACE代码:

REPLACE INTO person (id, first_name, last_name, age)
    VALUES (0, 'Frank', 'Smith', 100);
Run Code Online (Sandbox Code Playgroud)

编辑:我想我有另一个问题是你为什么要做一个DELETE/INSERT,而不仅仅是引用部分讨论的UPDATE?

Pat*_*man 18

根据文档,区别在于:

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

它的作用是什么:

  • 尝试使用其中一个可用索引匹配行;
  • 如果该行尚不存在:添加一行;
  • 如果该行已存在:删除现有行并在之后添加新行.

什么时候使用它可以对单独insertupdate语句有用?

  • 你可以安全地调用它,你不必担心现有的行(一个语句对两个语句);
  • 如果你想在inserting/ 时删除相关数据updating,你可以使用replace:它也会删除所有相关数据);
  • 当触发器需要触发时,你期望一个insert(不好的理由,好吧).


小智 5

并非所有数据库引擎都广泛理解 First Replace。

第二次替换基于主键插入/更新记录。使用更新时,您可以指定更详细的条件:

UPDATE person SET first_name = 'old ' + first_name WHERE age > 50
Run Code Online (Sandbox Code Playgroud)

UPDATE 也不会创建记录。


Sta*_*vas 3

UPDATE如果该行不存在则无效。

如果该行不存在,则INSERTREPLACE将插入,如果存在则替换值。

  • 您什么时候会选择执行删除/插入而不只是更新或替换? (2认同)