一次插入的独特价值

时间:2011-02-25 22:32:17

标签: sql sql-server sql-server-2005 tsql sql-server-2008

我有一个名为Test的表,它有两个名为Name和Phone_Number的列,我从另一个名为sample的表中将数据插入到测试表中。我正在做这样的事情:

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

现在我想在名为ID的Test表中添加第三列。对于每个Insert.Example,此ID必须是唯一的。

对于Instance,如果insert语句在测试表中插入2条记录,我希望ID为1,下次当我再插入3条记录时,那些ID应为2,依此类推

我想创建一个标识,但如果你一次插入3条记录,它会给你1,2和3,但我想要每个插入的唯一值。

有人可以帮我吗?

4 个答案:

答案 0 :(得分:3)

根据您的问题,我可以看到您不想要PK,您想多次调用INSERT语句,并且每次调用它时,都需要一个唯一的ID(每个插入批次的ID)。

像这样:(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是正确的功能

答案 1 :(得分:2)

创建IDENTITY(1,1)列并使用您的insert语句或尝试:

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

更新:所有插入的相同ID

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

答案 2 :(得分:2)

要解决并发问题(多用户)和阻塞/死锁问题(如果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()

显然最好将它放入存储过程并返回最后一个选择的值,或者至少将其分配给变量。

e.g。

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

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

答案 3 :(得分:0)

尝试这样的事情:

Insert into Test
select First_Name AS Name,
   Contact_Number AS Phone_Number,
   insertID=(select lastID=max(insertID)+1 from Sample)
from Sample