2017-03-22 12 views
0

値を複数の行に1つずつ挿入しようとすると、SQL Serverでエラーが発生します。SQL Serverエラー:主キーの違反 - なぜですか?

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.

それが現れて、このエラーであるのはなぜ?:だから、基本的に、私は繰り返し2番目のクエリを実行すると、このエラーが発生した次のテーブルとクエリ

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 

を作成しましたか私はフォームを作成しています。情報はSQL Serverに保存されますが、これは発生したくありません。私に何ができる?ありがとうございました。あなたの列に次の値を生成します

+0

ギャップがありますか?いくつかの種類のautoincrement/identity列、または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

増分を使用してIDに変更するには、テーブルをどのように変更できますか?ありがとうございました。 – Invisible

+0

このテーブル定義では、 'dates'カラムに明示的に値を与えない限り、新しいレコードを挿入することはできません。 insertステートメントには、少なくとも* 1つの値を挿入する必要があります。 – cars10m

+1

@Invisible:テーブル列を "identity"に変更することは、SQL Server内では実際には不可能です。 ID列を使用して新しい表を定義し、既存のデータを古い表からコピーする必要があります。これは、あなたがMSSQLスタジオ版でそれを行うなら、舞台裏で起こることです。 – cars10m

1

あなたはIDENTITYを使用します。これを手動で行う必要はありません。 INSERT文で、あなたの場合は

@@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

表現@i+1は常に同じ値を返します。変数@iの値はインクリメントされません。そのため、エラーが発生しています。 insert文をループ内に置き、ループ内の@iの値をインクリメントするには、文set @i = @i + 1を使用します。

関連する問題