繁体   English   中英

一次插入的唯一价值

[英]Unique Value for One Insert

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

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

现在,我想在测试表中添加第三列,即ID。 每个插入的ID必须是唯一的。

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

我想创建一个身份,但是如果您一次插入3条记录,它将给您1,2和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是正确的功能

创建IDENTITY(1,1)列并使用您的插入语句或尝试执行以下操作:

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

为了解决并发问题(多用户)和阻塞/死锁问题(MAX()查询可能阻塞或不正确,如果不这样做),您需要在其他位置创建IDENTITY。

这是一个示例-首先创建一个带有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()

显然,最好将其放入存储的proc中并返回上一次选择的值,或者至少将其分配给变量。

例如

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

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

尝试这样的事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM