我有一个名为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,但我想要每个插入的唯一值。
有人可以帮我吗?
答案 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