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 将无效。

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

【讨论】:

你什么时候会选择执行删除/插入而不是更新或替换?【参考方案2】:

根据documentation,区别是:

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

那么它的作用:

尝试使用可用索引之一匹配行; 如果该行不存在:添加一个新行; 如果该行已存在:删除现有行,然后添加一个新行。

什么时候可以使用它而不是单独的 insertupdate 语句?

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

【讨论】:

【参考方案3】:

First Replace 并未在所有数据库引擎中得到广泛理解。

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

UPDATE person SET first_name = 'old ' + first_name WHERE age > 50

UPDATE 也不会创建记录。

【讨论】:

【参考方案4】:

更新将根据特定条件更改表中的现有记录值。因此,您可以在单个查询中更改一条或多条记录。

如果表中不存在记录,则插入或替换将插入新记录,否则将替换。 仅当且仅当您在插入或替换查询中提供主键值时,替换才会起作用。如果您忘记添加主键字段值,则会在表中创建新记录。

案例:-

更新:您需要根据使用列值的公式计算工资。在这种情况下,您将始终使用更新查询,因为使用一个查询可以更新多条记录。

插入或替换:已在您分享的链接中提及。

【讨论】:

以上是关于SQL 中的 REPLACE 与 INSERT的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中的正则函数

SQL语句replace怎么替换?

sql替换数据库字段中的字符

Oracle sql 中的字符(串)替换与转换

总结Oracle sql 中的字符(串)替换与转换

SQL语法:Replace into 与 Insert into 的区别