为什么SQL不支持upsert用例?我不是问如何在特定的db(*)中做。我想知道的是为什么upsert不是像插入和更新这样的基本操作。我的意思是这是一个非常简单的用例吗?我想必须有一些基本的db first原则在进行upsert时会被破坏,或者在面对upsert时db引擎面临一些技术挑战。
*。我知道mysql语法和SQL Merge语法。顺便说一句,即使使用这种特定于db的语法,您还需要注意原子性和锁定。使用合并语法,它不需要创建一个伪表。
编辑:我正在编辑此内容以澄清我不是在征求意见。所以我不认为这个问题应该被阻止。
答案 0 :(得分:3)
因为它不容易处理,无论是酸还是语法。
更新条件(如果存在)尚不清楚。
例如,在下面的查询中用upsert替换“insert into”
insert into t_something
select * from t_whatever
没有外键,没有主键。
你想怎么更新?
where条件是适用于select还是更新?
最终,您必须编写条件,然后您也可以执行“更新/插入if”...
通常,当你问自己upsert问题时,你正在处理插入/更新错误。
你在用对象术语思考而不是设定术语。
你想循环遍历一个对象数组,如果存在count(*)on,则插入0,否则更新。
这就是面向对象的命令式编程的工作方式,但这不是SQL的工作原理
在SQL中,您使用SET进行操作
您可以轻松地进行内部联接 - 更新SET
和左连接,其中null插入同一个SET
这和合并一样舒服,而且可读性更高,调试也更简单
它可能会更快。
你已经可以通过更新和放大来确保它完全是原子的。插入交易。
思考upsert,你接下来想要哪种愚蠢? “UpSertLeteTrunc”? MerDel?
或者也许是truncsert?
到目前为止,还有更重要的事情要做。