2016-12-06 59 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是一個dublicate。但運行一個選擇:

SELECT * FROM APP_NOTIFICATION_LOG WHERE ID = 5 

...返回零記錄。

這裏有什麼問題?

+2

如果多個會話同時運行SQL(或插入中有多行),那麼使用IDENTITY列,使用'select max()+ 1'是不安全的。 –

+0

已注意。我會相應地更新我的腳本。 –

回答

1

Select是否返回多條記錄?

單獨運行它並查看返回了多少行。

+0

這其實是原因。 –

1

您的內部連接返回的不僅僅是1個結果,因此您嘗試插入具有相同ID的多行。

相關問題