SQL 中的 REPLACE 与 INSERT
Posted
技术标签:
【中文标题】SQL 中的 REPLACE 与 INSERT【英文标题】:REPLACE versus INSERT in SQL 【发布时间】:2015-06-14 21:33:02 【问题描述】:我正在做以下SQL教程:http://sql.learncodethehardway.org/book/ex11.html
在这个练习中,作者在第二段中说:
在这种情况下,我想用另一个人替换我的记录,但是 保留唯一标识。问题是我必须要么做一个删除/插入 在事务中使其成为原子,否则我需要进行完整的更新。
谁能向我解释一下执行 UPDATE 的问题是什么?什么时候我们可能会选择 REPLACE 而不是 UPDATE?
更新代码:
UPDATE person SET first_name = "Frank", last_name = "Smith", age = 100
WHERE id = 0;
这里是替换代码:
REPLACE INTO person (id, first_name, last_name, age)
VALUES (0, 'Frank', 'Smith', 100);
编辑:我想我的另一个问题是,您为什么要执行 DELETE/INSERT 而不仅仅是引用部分中讨论的 UPDATE?
【问题讨论】:
这不是标准的 SQL。你指的是 SQLite 还是 mysql?添加标签以阐明您在说什么。 【参考方案1】:如果该行不存在,UPDATE
将无效。
如果行不存在,INSERT
或 REPLACE
将插入其中,如果存在则替换值。
【讨论】:
你什么时候会选择执行删除/插入而不是更新或替换?【参考方案2】:根据documentation,区别是:
REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。
那么它的作用:
尝试使用可用索引之一匹配行; 如果该行不存在:添加一个新行; 如果该行已存在:删除现有行,然后添加一个新行。什么时候可以使用它而不是单独的 insert
和 update
语句?
inserting
/updating
时删除相关数据,你可以使用replace
:它也会删除所有相关数据);
当触发器需要触发并且您期望 insert
(不好的原因,好吧)时。
【讨论】:
【参考方案3】:First Replace 并未在所有数据库引擎中得到广泛理解。
第二次替换基于主键插入/更新记录。使用更新时,您可以指定更详细的条件:
UPDATE person SET first_name = 'old ' + first_name WHERE age > 50
UPDATE 也不会创建记录。
【讨论】:
【参考方案4】:更新将根据特定条件更改表中的现有记录值。因此,您可以在单个查询中更改一条或多条记录。
如果表中不存在记录,则插入或替换将插入新记录,否则将替换。 仅当且仅当您在插入或替换查询中提供主键值时,替换才会起作用。如果您忘记添加主键字段值,则会在表中创建新记录。
案例:-
更新:您需要根据使用列值的公式计算工资。在这种情况下,您将始终使用更新查询,因为使用一个查询可以更新多条记录。
插入或替换:已在您分享的链接中提及。
【讨论】:
以上是关于SQL 中的 REPLACE 与 INSERT的主要内容,如果未能解决你的问题,请参考以下文章