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
请注意表提示的用法 - holdlock和updlock 。 它们阻止另一个线程执行完全相同的查询并第二次创建该行。 有关更多信息,请查看隔离,同步,死锁和并发更新。
我会做:
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