在与主行相同的事务中插入具有外键关系的行

时间:2013-03-25 20:13:42

标签: sql sql-server ado.net

我有一个2表,其中一个表与另一个表有外键关系

CREATE TABLE foo (
  id INT NOT NULL PRIMARY KEY IDENTITY,
  value VARCHAR(50) DEFAULT NULL,
);

CREATE TABLE bar (
  id INT NOT NULL PRIMARY KEY IDENTITY,
  foo_key INT NOT NULL
  value VARCHAR(50) DEFAULT NULL,
);

我正在使用参数化的ADO.NET ExecuteReader来插入新行。我的腌菜是,如果我想在同一个事务中的不同表中插入2行,即在提交之前,我不能在bar中插入行,因为我不知道已经赋予foo.id的值。你会怎么做呢?即如何确保为bar.foo_key分配正确的值?试图选择它什么都没带来,因为我猜它实际上还没有。我是否应该使用存储过程来动态尝试生成密钥,或者可能存在可以使用的内部变量。或者有没有办法让插入返回新的ID?我是否需要外键声明,但我不确定它是否有用,因为我仍然不知道使用什么ID?

我想一次性完成的原因是由于错误处理,我希望能够在出现错误时将所有内容都回滚。

2 个答案:

答案 0 :(得分:5)

您可以使用scope_identity()检索新生成的identity

begin tran;
insert Foo (value) values ('6*7');
declare @fk int = scope_identity();
insert bar (foo_key, value) values (@fk, '42');
commit tran;

根据HLGEM的评论,要将新生成的身份的值返回给客户,您可以使用output

insert Foo (value) output inserted.ID values ('6*7');

请注意,对于跨越两个会话的事务,您需要一个非常昂贵的分布式事务。

答案 1 :(得分:0)

我发现我可以在插入

上返回scope_identity()
INSERT INTO [foo] ([value]) VALUES (@0) SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];