由于重复而插入失败后选择身份
假设我有一个 MS SQL Server 表,其中包含主键 ID 和唯一键名称。另外,名称设置为 IGNORE_DUP_KEY。我想要做的是插入一个名称,然后获取它的ID,而不管操作执行是否成功。即,如果名称不重复,则采用新的 ID,如果重复,则采用已存在的 ID。
显然,如果我执行 INSERT Name 然后选择 IDENTITY,那么在 Name 重复的情况下将无法正常工作(像 SCOPE_IDENTITY() 这样的函数在这种情况下将返回 NULL)。不过,我相信应该有一种方法可以轻松实现这一点,因为 INSERT 应该已经找到了未成功插入的 Name 的 ID。因此,该 ID 应在 O(1) 时间内可用。
另外,请注意,由于性能问题,向服务器发出两个单独的请求(插入和选择)对我来说不是一个选择。
Say I have an MS SQL Server table with a primary key ID and a unique key Name. Also, IGNORE_DUP_KEY is set for Name. What I want to do is to insert a name and then get its ID, regardless of the operation execution success. I.e. if the name is not a duplicate, take the new ID, if it is a duplicate, take the already existing ID.
Apparently, if I do INSERT Name and then SELECT an IDENTITY, that will not work properly in the cases when Name is a duplicate (functions like SCOPE_IDENTITY() and such will return NULL in this case). However, I believe there should be a way to easily achieve that, because the INSERT should have already found the ID of the unsuccessfully inserted Name. Thus, this ID should be available in O(1) time.
Also, please note that having two separate requests to the server (insert and select) is not an option for me because of performance concerns.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
IGNORE_DUP_KEY
表示如果在插入行时发现重复键,则插入行将被丢弃,并显示警告而不是错误,而其余行将继续插入。结果是重复行不受插入语句的影响,因此没有可读取的标识。不确定你的意图到底是什么,但我认为你不能用一个声明来做到这一点。
也许您需要使用 Merge 语句?
IGNORE_DUP_KEY
means that if a duplicate key is found during insert of a row, the insert row is discarded with a warning instead of an error, and the rest of the rows continue to be inserted.The result is that the duplicate row is not affected by the insert statement, so there is no identity to be read. Not sure what your intent here is exactly, but I don't think you can do it in a single statement.
Maybe you need to use a Merge statement?
这听起来像是一个有趣的slog,我将在周一以博客的形式发布它,但从未接触过ignore_dup_key选项,我想看看是否有办法按照OP的要求去做,如果基于设置ignore_dup_key插入软失败在唯一索引上,是否有一种简单的方法来“捕获”id。
总结一下下面的代码墙
此处代码
结果
This sounded like an interesting slog and I'll have this in blog form on Monday but having never touched the ignore_dup_key option, I wanted to see if there was a way to do as the OP asked, if an insert softly fails based on setting ignore_dup_key on a unique index, is there a simple way to "catch" the id.
To summarize the following wall of code
Code here
Results
如果我正确理解你的问题,你应该考虑创建一个 DML 触发器来处理这个逻辑。
如果我误解了你的问题,请告诉我。
If I am understanding your question correctly, you should look into creating a DML trigger to handle this logic.
Let me know if I am misunderstanding your question.
您需要获取
OUTPUT
子句中插入的值。这样做是这样的:INSERT foo (a, b)
输出插入.a,插入.b
You need to grab the inserted values in an
OUTPUT
clause. This is done like so:INSERT foo (a, b)
OUTPUT inserted.a,Inserted.b