2017-03-22 27 views
0

當我嘗試將值同時插入多行時,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 

當我反覆運行第二個查詢,這個錯誤發生:

Violation of PRIMARY KEY constraint 'PK__Dates__3213E83F76720BE7'. Cannot insert duplicate key in object 'dbo.Dates'. The duplicate key value is (3). The statement has been terminated.

爲什麼是這個錯誤顯示出來?我正在創建一個表單,信息將存儲在SQL Server中,我不希望發生這種情況。我能做什麼?謝謝。

+0

也許有差距?使用某種自動增量/標識列或任何SQL Server調用它。 – jarlh

+0

你是什麼意思?對不起,我是SQL新手 – Invisible

+4

首先,瞭解數據庫如何工作的基礎知識(您確實說過你是新手)。其次,讓數據庫爲您生成id字段。 –

回答

2

使用identity,將您列生成一個值自動

create table Dates (
    id int identity(1,1) primary key, 
    dates DateTime Not Null Default(GetDate()) 
) 
+0

我該如何修改表格以更改爲帶有增量的標識?謝謝。 – Invisible

+0

使用此表定義,您將無法插入新記錄,而不明確給出「日期」列的值。插入語句至少需要*一個*值,您要插入。 – cars10m

+1

@Invisible:在SQL-Server中不可能將表列更改爲「identity」。您將不得不定義一個帶有標識列的新表,然後從舊錶中複製現有數據。這是幕後發生的事情,如果你在MSSQL-studio版本中進行。 – cars10m

1

你想用IDENTITY。無需手動執行此操作。

在你的情況,@@ROWCOUNT不會因此你重複鍵更改......

Statements that make a simple assignment always set the @@ROWCOUNT value to 1. No rows are sent to the client. Examples of these statements are: SET @local_variable, RETURN, READTEXT, and select without query statements such as SELECT GETDATE() or SELECT 'Generic Text'.

declare @i int 

set @[email protected]@ROWCOUNT+1 
select @i 
set @i = @@ROWCOUNT+1 
select @i 
0

在INSERT語句表達@i+1總是返回相同的值。它不增加變量@i的值。這就是爲什麼有一個錯誤。將插入語句放入循環中,並使用語句set @i = @i + 1將循環內的值增加@i