sql - 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 比软件工程更合适。
解决方案
有社区响应,merge
对于一个表的插入/更新是完全有效的解决方案。但是,当然,update or insert
是更优雅的解决方案,例如在这种情况下,代码是:
update or insert into adv_days (adv_date, edit_state)
values ('27.11.2019', 1)
matching (adv_date)
该解决方案提高了合并的性能(如问题中所述),因为在两个语句重复多次的情况下,可以从计划和索引读取的数量中观察到。
这两种情况仍然存在缺点:重复执行会导致更新,尽管不必触摸已经具有所有必需值的记录。
推荐阅读
- reactjs - 将孩子描述为 instanceOf 或带有 prop-types 的 instanceOf 数组
- azure - sql 数据仓库批量复制期间的恐慌
- r - 通过在 R 中设置属性的数值阈值来子集 Shapefile
- mongodb - Parse 如何选择要使用的 Mongo 索引?
- android - WearPkgInstallerService:软件包安装失败。返回代码 -103
- xml - 如何将 XSL 文件包含到另一个 XSL 文件中
- c++ - 在类定义中具有用户定义谓词的集合对象
- asp.net - asp.net 应用程序中报告查看器的超时过期错误?
- python-3.x - 让 Tweepy 在 Proxy 后面工作
- python - 如何从父目录运行 unitest 测试套件