2016-12-06 19 views
0

に重複するキーを挿入することはできません:PRIMARY KEY制約違反。私はそうのように作成された主キー制約を持つテーブルを持っているオブジェクト

CONSTRAINT [APP_NOTIFICATION_LOG_PK] PRIMARY KEY CLUSTERED 
( 
    [ID] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

私は今削除したテーブル内のレコードをいくつか持っていました。

私は手動で次のIDがそうのように挿入するために見つける:

SELECT @maxid_log = max(ID) + 1 FROM APP_NOTIFICATION_LOG; 

そして、私はレコードを挿入しよう:この段階で

INSERT INTO [dbo].[APP_NOTIFICATION_LOG]([ID],[COLOR],[ACTIVE],[FK_SYS_USERS_ID],[FK_APP_NOTIFICATIONS_ID], [MESSAGE],[WIN_USER_CREATOR], [FK_JOBR_RESOURCE_ID]) 
SELECT -- log notification created 
    @maxid_log, 
    anc.COLOR, 
    1, 
    anc.[FK_SYS_USERS_ID], 
    an.id, 
    'Notification cancelled!', 
    @creatorUserId, 
    @jobrResourceDbId 
FROM [dbo].[APP_NOTIFICATIONS] an 
    INNER JOIN [dbo].[APP_NOTIFICATION_CONFIG] anc on anc.id = @configId 
WHERE an.[FK_JOBR_RESOURCE_ID] = @jobrResourceDbId 

はタイトルにエラーが発生します。それはまた、値5は公約であると言います。しかし、選択を実行している:

SELECT * FROM APP_NOTIFICATION_LOG WHERE ID = 5 

は...ゼロのレコードを返します。

ここで問題が発生する可能性がありますか?

+2

複数のセッションが同時にSQLを実行する(または挿入に複数の行がある)場合、 'select max()+ 1'は安全ではないというIDENTITYカラムを使用してください。 –

+0

注目。それに応じてスクリプトを更新します。 –

答えて

1

選択は複数のレコードを返していますか?

それを単独で実行し、返される行の数を確認します。

+0

それは実際には理由でした。 –

1

あなたの内部結合は1つ以上の結果を返します。したがって、同じIDを持つ複数の行を挿入しようとします。

関連する問題