SQL Server错误:违反主键 - 为什么?

时间:2017-03-22 16:44:23

标签: sql sql-server

当我尝试将值同时插入多个行时,SQL Server会导致错误。所以基本上,我创建了以下表和查询

create table Dates
(
     id int not null primary key, 
     dates DateTime Not Null Default(GetDate())
)

declare @i int 
set @i = @@ROWCOUNT + 1

insert into dbo.Dates(id)
values (@i + 1)

select * from Dates

当我反复运行第二个查询时,会发生以下错误:

  

违反PRIMARY KEY约束'PK__Dates__3213E83F76720BE7'。无法在对象'dbo.Dates'中插入重复键。重复键值为(3)。   声明已经终止。

为什么会出现此错误?我正在创建一个表单,信息将存储在SQL Server中,我不希望这种情况发生。我能做什么?谢谢。

3 个答案:

答案 0 :(得分:2)

使用identity自动生成列的下一个值

{{1}}

答案 1 :(得分:1)

您想使用IDENTITY。无需手动执行此操作。

在您的情况下,@@ROWCOUNT不会更改,因此您会获得重复的密钥...

  

进行简单赋值的语句始终将@@ ROWCOUNT值设置为1.不向客户端发送任何行。这些语句的示例包括:SET @local_variable,RETURN,READTEXT和select,不包含SELECT GETDATE()或SELECT'Generic Text'等查询语句。

declare @i  int 

set @i=@@ROWCOUNT+1
select @i
set @i = @@ROWCOUNT+1
select @i

答案 2 :(得分:0)

insert语句中的表达式@i+1将始终返回相同的值。它不会增加变量@i的值。这就是出错的原因。将insert语句放在循环中并使用语句set @i = @i + 1来增加循环内@i的值。