Уникальное значение для одной вставки - PullRequest
0 голосов
/ 26 февраля 2011

У меня есть таблица с именем Test, и в ней есть два столбца с именами и Phone_Number, и я вставляю данные в тестовую таблицу из другой таблицы, называемой sample. Я делаю что-то вроде этого:

Insert into Test
select First_Name AS Name,
       Contact_Number AS Phone_Number
 from Sample

Теперь я хочу добавить третий столбец в тестовую таблицу с именем ID. Этот идентификатор должен быть уникальным для каждой вставки. Пример:

Для Экземпляра, если этот оператор вставки вставляет 2 записи в тестовую таблицу, я хочу, чтобы идентификатор был равен 1, и в следующий раз, когда я вставлю еще 3 записи, эти идентификаторы должны иметь значение 2 и т. Д.

Я думал о создании Identity, но если вы вставите 3 записи за один раз, это даст вам 1,2 и 3, но я хочу уникальное значение для каждой вставки.

Может ли кто-нибудь помочь мне в этом?

Ответы [ 4 ]

3 голосов
/ 26 февраля 2011

Из вашего вопроса я вижу, что вам не нужен PK, вы хотите вызывать оператор INSERT несколько раз, и для каждого вызова вам нужен уникальный идентификатор (идентификатор для каждого пакета вставки).

Примерно так: (Oracle)

insert into Test (Name, Phone_Number, ID)
  select First_Name, Contact_Number, (select nvl(max(ID), 0) + 1 from Test)
    from Sample;

А для SQL Server

insert into Test (Name, Phone_Number, ID)
  select First_Name, Contact_Number, (select isnull(max(ID), 0) + 1 from Test)
    from Sample

РЕДАКТИРОВАТЬ: isnull является правильной функцией

2 голосов
/ 26 февраля 2011

Чтобы обойти проблемы параллелизма (многопользовательские) и проблемы блокировки / взаимоблокировки (запрос MAX () может блокировать или быть неправильным, если он этого не делает), вам нужно создать IDENTITY в другом месте.

Вот пример - сначала создайте фиктивную таблицу со столбцом идентификаторов для предоставления уникальных номеров.

create table Test_IDGen (id int identity, dummy int)

Пакет TSQL для получения следующего числа будет выглядеть примерно так:

insert Test_IDGen(dummy) values (null)
delete Test_IDGen with (readpast)  -- cleanup, don't store data unnecessarily
select SCOPE_IDENTITY()
* 1008Очевидно, что лучше поместить его в сохраненный процесс и вернуть значение последнего выбора или, по крайней мере, присвоить его переменной.

например

..
declare @batchid int
select @batchid = SCOPE_IDENTITY()

Insert into Test
select First_Name AS Name,
       Contact_Number AS Phone_Number,
       @batchid
 from Sample
2 голосов
/ 26 февраля 2011

создайте IDENTITY(1,1) столбец и используйте оператор вставки или попробуйте следующее:

insert into Test
select First_Name as Name, Contact_Number as Phone_Number, NEWID() as calledId
from Sample

update: одинаковый идентификатор для всех вставок

declare @newid as uniqueidentifier
set @newid = NEWID()

insert into Test
select First_Name as Name, Contact_Number as Phone_Number, @newid as calledId
from Sample
0 голосов
/ 26 февраля 2011

Попробуйте что-то вроде этого:

Insert into Test
select First_Name AS Name,
   Contact_Number AS Phone_Number,
   insertID=(select lastID=max(insertID)+1 from Sample)
from Sample
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...