Добавьте две строки с внешним ключом - SQL - PullRequest
2 голосов
/ 15 декабря 2010

Мне интересно, как я могу добавить 2 строки, из которых 1 зависит от другой, в 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 голосов
/ 15 декабря 2010

Вы можете использовать T-SQL scope_identity, чтобы вернуть новый идентификатор из первого оператора INSERT.

Перед вашим первым INSERT, объявите переменную для хранения значения нового идентификатора:

DECLARE @ReturnValue int;

Сразу после вашего первого INSERT, добавьте это, чтобы установить значение этой переменной:

SELECT @ReturnValue = scope_identity()

Затем вы можете использовать переменную @ReturnValue во втором INSERT вместо:

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', @ReturnValue)
4 голосов
/ 15 декабря 2010

Вы можете сделать это в одном пакете:

declare @key as int;
insert into users (username)
values ('malcom.reynolds');
set @key = (select scope_identity());
insert into spaceships (name, owner)
values ('Serenity', @key)
4 голосов
/ 15 декабря 2010

Посмотрите на 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() )
2 голосов
/ 15 декабря 2010

Или вы можете использовать OUTPUT.Это намного сложнее, когда вам нужно вернуть более одного поля или выполнить многоточечную вставку для начала.Вы можете использовать переменную таблицы, если вы делаете несколько строк вместо переменной int.

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

insert into spaceships (name, owner) 
values ('Serenity', @key) 
...