SQL选择或插入返回ID

好吧,这里有一个快速的SQL问题(使用sql-server-2008)。

我有一个映射表names与以下列

ID DisplayName

我想要做的是首先SELECT [ID] FROM [names] WHERE [DisplayName] = 'chuck';

但是,如果数据库中不存在名称'chuck',我想创建它,并返回自动递增的ID

我想知道SQL是否以一种简单的方式构建了这种方法,或者如果我必须走长路线?

漫长的路线就是这样的

SELECT COUNT(ID) AS count, ID FROM names WHERE DisplayName='chuck'
IF(count > 0)
    SELECT ID as ReturnID;
ELSE
    BEGIN
    INSERT INTO names(DisplayName) values('chuck');
    SELECT scope_identity() as ReturnID;
    END

我没有测试最后的陈述,但我认为漫长的道路会是这样的。 如果没有内置的方式,我会很感激,如果有人可以简单地纠正该声明(因为我确信它不完全正确)。


您还应该关注交易:

set XACT_ABORT on
begin tran

declare @ID int

select @ID = ID from names with (holdlock, updlock) WHERE DisplayName='chuck'

if @@rowcount = 0
begin
  INSERT INTO names(DisplayName) values('chuck');
  set @ID = scope_identity();
end

select @ID as ReturnID;

commit tran

请注意表提示的用法 - holdlockupdlock 。 它们阻止另一个线程执行完全相同的查询并第二次创建该行。 有关更多信息,请查看隔离,同步,死锁和并发更新。


我会做:

IF (NOT EXISTS(SELECT null from names where DisplayName='Chuck'))
   INSERT INTO Names (DisplayName) Values ('Chuck')

SELECT ID as ReturnID FROM Names where DisplayName='Chuck'

虽然节省不多

链接地址: http://www.djcxy.com/p/57783.html

上一篇: SQL Select or Insert return ID

下一篇: Overflow button forces Action Mode to finish