2

我正在考虑如何在 1 个事务中添加 2 行,其中 1 行取决于另一行。

INSERT INTO users (username) VALUES ('malcom.reynolds')

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', <<Malcom Reynold's row ID>>)

我这样做的原因是我正在使用的库不返回 rowid,我需要尽可能少地提交事务,因为我要添加超过几百万条记录!

只是为了我正在使用的记录:

  • SQL Server 2008
  • Python
  • pyodbc

任何想法?真的很棒:)

4

4 回答 4

4

看看http://msdn.microsoft.com/en-us/library/aa259185%28SQL.80%29.aspx

INSERT INTO users (username) VALUES ('malcom.reynolds');

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', SCOPE_IDENTITY() )
于 2010-12-15T19:58:08.367 回答
4

您可以使用 T-SQL从第一条语句scope_identity返回新 ID 。INSERT

在第一个之前INSERT,声明一个变量来保存新 ID 的值:

DECLARE @ReturnValue int;

在你的第一个之后INSERT,添加这个来设置该变量的值:

SELECT @ReturnValue = scope_identity()

然后,您可以使用@ReturnValue第二个变量INSERT代替:

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', @ReturnValue)
于 2010-12-15T19:58:28.180 回答
4

您可以在一个批处理语句中执行此操作:

declare @key as int;
insert into users (username)
values ('malcom.reynolds');
set @key = (select scope_identity());
insert into spaceships (name, owner)
values ('Serenity', @key)
于 2010-12-15T19:59:08.220 回答
2

或者您可以使用输出。当您需要返回多个字段或开始进行多行插入时,这是更有效的。如果您正在执行多行而不是 int 变量,则可以使用表变量。

DECLARE @key int
insert into users (username)
output inserted.userid 
values ('malcom.reynolds'); 

insert into spaceships (name, owner) 
values ('Serenity', @key) 
于 2010-12-15T20:20:16.717 回答