2013-07-01 5 views
0

Я пытаюсь обновить таблицу SQL с этой хранимой процедурой:SQL Statement обновления конфликт с внешним ключом

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 WITH CHECK. Это приведет к недопустимым данным в таблице. –

ответ

0

Значение, хранящееся в столбце PaymentStatusId, не должно быть в таблице PaymentStatus.

Убедитесь, что PostingStatusId, PaymentStatusId являются действительными идентификаторами и существуют в соответствующих таблицах.

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

Спасибо, но я не пытаюсь обновить это поле, paymentstatusID, только postingstatusid. Зачем мне также включать это поле? – Laziale

+0

@ Laziale - Я понимаю, что вы не пытаетесь обновить это поле. Я включил SELECT, чтобы вы могли проверить, что «PaymentStatusId» и «PostingStatusId» действительны (I.e. они существуют в другой таблице), поэтому ограничение внешнего ключа может пройти. –

+0

они оба существуют: http://gyazo.com/1341148fb74a2c0a1dd9def21e542c83.png – Laziale

0

Я хотел бы предложить, выполнив следующую команду:

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

Вы, вероятно, имеете плохие данные в таблице проводок, которые в настоящее время помечены здесь. Как это получилось ... Я бы предположил, что ограничение было создано или воссоздано после заполнения данных, а опция WITH CHECK была отключена.

Смежные вопросы