避免在 "update or insert" SQL 中进行不必要的更新?

Avoid unnecessary update in "update or insert" SQL?

这是 Firebird SQL 更新或插入的描述:

https://firebirdsql.org/refdocs/langrefupd25-update-or-insert.html

还有我的例子

update or insert into books (id, name)
  values (555, 'Good book')
  matching (id)

如果书已经存在 id=555name='Good book' 则此命令无论如何都会执行更新语句并且更新触发器的触发是此类更新的唯一效果,不会更改记录的值.如果可更新字段(例如本例中的名称)已经具有指定的值,是否可以在此 SQL 中请求不需要执行更新。

我的问题是针对 Firebird 2、3、4。但是如果 SQL 服务器、MySQL 或 Oracle 中有类似的预防条款,那么我会很高兴听到。

如果您不想更新,则不应使用 UPDATE OR INSERT, but instead use MERGE, or use INSERT 并捕获并忽略重复键错误(假设您有合适的主键或唯一键约束)。

使用示例MERGE

merge into books 
using (
  select 555 as id, 'Good book' as name
  from rdb$database) as src
on books.id = src.id
when not matched then
  insert (id, name) values (src.id, src.name)