2013-07-01 96 views
0

我想用這個存儲過程來更新SQL表:當我執行該查詢我收到此錯誤SQL UPDATE語句衝突的外鍵

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 

CREATE PROCEDURE [dbo].[UpdatePostingStatusAngel] 
    @PostingStatusID tinyint, 
    @PostingID int 
AS 
UPDATE dbo.Posting 
SET 
    PostingStatusID = @PostingStatusID 
WHERE PostingID = @PostingID 

The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_Posting_PaymentStatus". The conflict occurred in database "JobsDB2008", table "dbo.PaymentStatus", column 'PaymentStatusID'.

這是真的奇怪,因爲我沒有更新'PaymentStatusID'列我不知道爲什麼它會讓我在該列發生衝突。該列也被設置爲NULL,並且它已經具有值。 我想只更新PostingStatusID字段。 任何想法可能是什麼原因? 在此先感謝,Laziale

+2

你可以編輯你的文章包括兩個表的定義? –

+0

假設你的外鍵實際上是正確定義的,並且引用'PaymentStatusId'而不是'PostingStatusId',那麼在某個時候外鍵可能被禁用了,而不用'WITH CHECK'選項重新啓用。這會在表中留下無效數據。 –

回答

0

存儲在PaymentStatusId列中的值不得存在於PaymentStatus表中。

確保PostingStatusId,PaymentStatusId是有效的ID並存在於適當的表中。

SELECT PaymentStatusId, PostingStatusId 
FROM Posting 
WHERE PostingId = @PostingId 
+0

謝謝,但我沒有試圖更新該字段paymentstatusID,只有poststatusid。爲什麼我還需要包含該字段? – Laziale

+0

@Laziale - 我知道你並沒有試圖更新這個領域。我包含了SELECT,因此您可以測試PaymentStatusId和PostingStatusId是否有效(即,它們存在於另一個表中),因此外鍵約束可以通過。 –

+0

它們都存在:http://gyazo.com/1341148fb74a2c0a1dd9def21e542c83.png – Laziale

0

我建議運行下面的命令:

SELECT * 
FROM dbo.Posting 
WHERE PaymentStatusId 
NOT IN (
    SELECT PaymentStatusId 
    FROM dbo.PaymentStatus 
) 

你可能在發帖表壞數據正在這裏標記。它是如何進入的......我猜測約束是在數據填充後創建或重新創建的,並且WITH CHECK選項被禁用。