SQL UPDATE FROM INNER JOIN ошибка - ошибка внешнего ключа - PullRequest
0 голосов
/ 03 января 2019

У меня есть следующий сценарий:

TABLE_B

  • ID - это первичный ключ
  • ID_MASTER, COL - внешний ключ, ссылающийся на TABLE_MASTER(ID, COL)

Пример данных:

    ID  ID_MASTER  COL  TYPE
   --------------------------
    1     1000  0      A
    2     1000  0      A
    3     2000  0      B
    4     2000  0      B

TABLE_MASTER

  • (ID, COL) является первичным ключом

Данные SaAmple:

    ID   COL   DESC
   --------------------
    1000 0     XXX
    2000 0     AAA
    3000 0     BBB

--##SOURCETEMPTABLE

    FROM_ID   TO_ID
    1000     3000

Я пытаюсь запустить это ОБНОВЛЕНИЕ:

UPDATE P
SET P.ID_MASTER = N.TO_ID,
    P.COL = 0
    /*SELECT N.TO_ID,* --JUST FOR CHECK THE ROWS BEING UPDATED*/
FROM TABLE_B P
INNER JOIN ##SOURCETEMPTABLE N ON N.FROM_ID = P.ID_MASTER
WHERE P.ID_MASTER = 1000

Возвращает ошибку «конфликт внешних ключей»

Оператор UPDATE конфликтовал с ограничением FOREIGN KEY "FKTABLE_B_ID". Конфликт произошел в базе данных "base_x", таблица "dbo.TABLE_MASTER"

Но когда я выполняю ту же инструкцию, используя «статическое» значение вместо N.TO_ID, она работает нормально:

UPDATE P
SET P.ID_MASTER = 2000, --static value
    P.COL = 0
    /*SELECT N.TO_ID,* --JUST FOR CHECK THE ROWS BEING UPDATED*/
FROM TABLE_B P
INNER JOIN ##SOURCETEMPTABLE N ON N.FROM_ID = P.ID_MASTER
WHERE P.ID_MASTER = 1000

1 Ответ

0 голосов
/ 03 января 2019

Ваша ошибка не воспроизводится. Я выполнил следующий тест и получил сообщение (затронуто 2 строк) без сообщения об ошибке. Вы должны делать что-то, кроме того, что вы описываете в своем вопросе:

CREATE TABLE TABLE_MASTER (
    ID int
,   COL int
,   CONSTRAINT PK_TM
    PRIMARY KEY (ID, COL)
);

INSERT INTO TABLE_MASTER VALUES 
(1000,0)
,(2000,0)
,(3000,0)
;

CREATE TABLE TABLE_B (
  ID int
, ID_MASTER int
, COL int
, CONSTRAINT PK_TB
  PRIMARY KEY (ID)
, CONSTRAINT FKTABLE_B_ID
  FOREIGN KEY (ID_MASTER, COL)
  REFERENCES TABLE_MASTER(ID, COL)
);

INSERT INTO TABLE_B VALUES
(1,1000,0)
,(2,1000,0)
,(3,2000,0)
,(4,2000,0)
;

CREATE TABLE Source (
 FROM_ID int
, TO_ID int
)

INSERT INTO Source VALUES (1000,3000);

UPDATE 
        P
    SET
        P.ID_MASTER = N.TO_ID,
        P.COL = 0

    /*SELECT N.TO_ID,* --JUST FOR CHECK THE ROWS BEING UPDATED*/
    FROM TABLE_B P
    INNER JOIN Source N
        ON N.FROM_ID = P.ID_MASTER
    WHERE P.ID_MASTER = 1000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...