首页 > 解决方案 > SQL 合并是单表选择检查更新语句的良好替代品吗?

问题描述

我有表adv_days(adv_date date not null primary key, edit_state integer),我想做一系列命令:检查表中是否存在“27.11.2019”,如果存在则将edit_state更新为1,如果不存在,则插入日期“27.11.2019”,edit_state = 1。

我想出了 Firebrid 合并语句:

merge into adv_days d
  using (select adv_date, edit_state from adv_days where adv_date='27.11.2019') d2
  on (d.adv_date=d2.adv_date)
when matched then update set d.edit_state=1
when not matched then
  insert(adv_date, edit_state)
  values(:adv_date, 1); 

它按预期编译和工作,但我阅读的所有合并示例都是关于应用到 2 个表的。那么 - 对于一张表的选择检查更新操作,也许有比合并更好的解决方案?

这是设计问题,但如此具体以至于 SO 比软件工程更合适。

标签: sqlfirebirdsql-merge

解决方案


有社区响应,merge对于一个表的插入/更新是完全有效的解决方案。但是,当然,update or insert是更优雅的解决方案,例如在这种情况下,代码是:

update or insert into adv_days (adv_date, edit_state)
  values ('27.11.2019', 1)
  matching (adv_date)

该解决方案提高了合并的性能(如问题中所述),因为在两个语句重复多次的情况下,可以从计划和索引读取的数量中观察到。

这两种情况仍然存在缺点:重复执行会导致更新,尽管不必触摸已经具有所有必需值的记录。


推荐阅读