Как вставить в таблицу и получить значение первичного ключа? - PullRequest
18 голосов
/ 01 сентября 2009

У меня установлен первичный ключ с автоматическим приращением.

Я делаю несколько запросов, и мне нужно извлечь значение первичного ключа, чтобы использовать его в качестве внешнего ключа в другой таблице (IsIdentity = TRUE).

Есть ли какой-нибудь элегантный способ вернуть значение первичного ключа, когда я делаю запрос вставки? Прямо сейчас я запрашиваю и получаю самое высокое значение в этом столбце, которое кажется очень странным.

Есть предложения?

Ответы [ 6 ]

37 голосов
/ 01 сентября 2009

Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать предложение OUTPUT.

create table T(
  pk int identity primary key,
  dat varchar(20)
);
go

insert into T
output inserted.pk
values ('new item');
go

drop table T;

Вывод может быть направлен как на таблицу, так и на клиента. Например:

create table T(
  pk int identity primary key,
  dat varchar(20)
);

create table U(
  i int identity(1001,1) primary key,
  T_pk int not null,
  d datetime
);
go


insert into T
output inserted.pk, getdate()
into U(T_pk,d)
values ('new item'), ('newer item');
go

select * from T;
select * from U;
go

drop table T, U;

Начиная с SQL Server 2008, вы можете использовать "составной DML" для большего количества возможностей.

28 голосов
/ 01 сентября 2009
insert into YourTable values (...)

получить новый PK с scope_identity ()

select scope_identity()
10 голосов
/ 01 июня 2013
INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)

Примечание: это для MS SQL 2005 и выше

4 голосов
/ 01 сентября 2009

SCOPE_IDENTITY (), вероятно, то, что вы хотите. Возвращает идентификатор последней записи, вставленной тем же контекстом кода, в котором она выполняется.

IDENT_CURRENT ('имя таблицы') подвержено проблемам параллелизма. То есть, нет никакой гарантии, что между INSERT и вызовом IDENT_CURRENT не будет вставлена ​​другая запись.

Должен признаться, я не уверен, к какому изумлению относится вспышка VillageIdiot, но я сам очень удивлен, что этот вопрос, похоже, совсем не дублирует.

2 голосов
/ 01 сентября 2009

Вы должны использовать scope_identity (). И я рекомендую заключить оператор вставки и scope_identity () в транзакцию.

2 голосов
/ 01 сентября 2009

Святое дерьмо !!!

просто позвоните SCOPE_IDENTITY() функция:

insert into your_talble(col1,col2) values('blah','more blah')
select scope_identity()

потому что при выборе максимального значения будет возвращена ошибка, если какой-либо другой оператор сделает вставку. функция scope_identity() возвращает идентификатор, созданный в текущем контексте (то есть по вашему утверждению)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...