为什么upsert不是一个基本的SQL操作

时间:2014-08-05 13:13:51

标签: sql upsert

为什么SQL不支持upsert用例?我不是问如何在特定的db(*)中做。我想知道的是为什么upsert不是像插入和更新这样的基本操作。我的意思是这是一个非常简单的用例吗?我想必须有一些基本的db first原则在进行upsert时会被破坏,或者在面对upsert时db引擎面临一些技术挑战。

*。我知道mysql语法和SQL Merge语法。顺便说一句,即使使用这种特定于db的语法,您还需要注意原子性和锁定。使用合并语法,它不需要创建一个伪表。

编辑:我正在编辑此内容以澄清我不是在征求意见。所以我不认为这个问题应该被阻止。

1 个答案:

答案 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?

到目前为止,还有更重要的事情要做。