![](/img/trans.png)
[英]Insert a value into a database only if one column is unique for a given ID
[英]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.