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

agg*_*ton 5 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,
);
Run Code Online (Sandbox Code Playgroud)

我正在使用参数化的ADO.NET ExecuteReader插入新行。我的泡菜是,如果我想在同一事务中的不同表中插入2行,即在提交之前,我不能在bar中插入行,因为我还不知道给定foo.id的值。您将如何去做?即我如何确保为bar.foo_key分配正确的值?尝试选择它不会带来任何好处,因为我猜它实际上还没有出现。我应该使用存储过程来尝试动态生成密钥,还是应该使用内部变量。还是有办法让插入返回新的ID?我不确定是否需要外键声明,因为我仍然不知道使用什么ID,我不确定这是否有用?

之所以要一次性执行该操作,是因为要进行错误处理,因此我希望能够在发生错误的情况下将所有内容回滚。

And*_*mar 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;
Run Code Online (Sandbox Code Playgroud)

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

insert Foo (value) output inserted.ID values ('6*7');
Run Code Online (Sandbox Code Playgroud)

请注意,要使一个事务跨越两个会话,就需要一个分布式事务,这非常昂贵。