SQL Server UPDATE INNER JOIN错误-外键错误

时间:2019-01-03 19:54:09

标签: sql-server tsql sql-update

我有以下情况:

TABLE_B

  • ID是主键
  • ID_MASTERCOL是引用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)是主键

Sample数据:

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

--##SOURCETEMPTABLE

    FROM_ID   TO_ID
    1000     3000

我正在尝试运行此UPDATE:

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 :(得分:1)

您的错误无法重现。我进行了以下测试,并收到消息(受影响的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