SQL Server数据库未在ON UPDATE CASCADE上更新

时间:2018-09-25 16:23:57

标签: sql sql-server tsql

我无法使ON UPDATE CASCADE正常运行,没有语法错误,但是每当更新tableA.a1时,tableB都没有变化,我不确定发生了什么。当显示tableA时,它已更新,但tableB没有更新。

这是我的代码:

CREATE TABLE tableA 
(
    a1 int NOT NULL,
    a2 int NOT NULL,
    a3 int NOT NULL,
    a4 varchar(50) NOT NULL UNIQUE,
    a5 TEXT,
    a6 DECIMAL(38,2) NOT NULL,
    CHECK (a6 > -99999.99 AND a6 < 99999.99),
    CHECK (a3 >= 1 AND a3 <= 10),
    PRIMARY KEY (a1,a2) 
);

CREATE TABLE tableB 
(
    b1 int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    b2 int NOT NULL DEFAULT 1,
    b3 int NOT NULL DEFAULT 1,
    b4 char(10) NOT NULL,
    b5 date,
);

INSERT INTO tableB (b4,b5)
VALUES (45, '1980-12-17');

INSERT INTO tableA (a1, a2, a3, a4, a5, a6)
VALUES (1, 2, 1, 4, 'hello', 38.32);

ALTER TABLE tableB WITH NOCHECK
    ADD CONSTRAINT b2f 
        FOREIGN KEY (b2, b3) REFERENCES tableA(a1, a2)
             ON DELETE SET DEFAULT 
             ON UPDATE CASCADE;

ALTER TABLE tableA WITH NOCHECK
    ADD FOREIGN KEY (a3) REFERENCES tableB(b1);

UPDATE tableA
SET a1 = 5;

SELECT *
FROM tableA;

SELECT *
FROM tableB;

表中数据的输出

Output of data in tables

2 个答案:

答案 0 :(得分:0)

因为当表a中外键为a3时您正在更新a1,因此如果更新a3表b则b1应该更改:

UPDATE tableA
SET a3 = 5;
select b1 from tableb

,如果对于此分配,您想要更改a1并将b2更新为a1 所以您需要像这样一一创建fk:

FOREIGN KEY (b2) REFERENCES tableA(a1)
FOREIGN KEY ( b3) REFERENCES tableA( a2)

不是这个:

FOREIGN KEY (b2, b3) REFERENCES tableA(a1, a2)

因为此行将两者都设为fk

答案 1 :(得分:0)

错误设置

  • 您已应用WITH NOCHECK来禁用FK验证和维护
  • 样本数据显示出死胎的“完整性”。如果设置WITH CHECK选项-每个FK创建都会失败,并显示
  

ALTER TABLE语句与FOREIGN KEY约束“ b2f”冲突。在数据库“ db_18_2ea6b”的表“ dbo.tableA”中发生了冲突。

FOREIGN KEY (b2, b3) REFERENCES tableA(a1, a2)

但是(a1=1, a2=2)(b2=(default)1, b3=(default)1)-这将如何工作?这是一个残破的参考!

FOREIGN KEY (a3) REFERENCES tableB(b1)

但是(a3=4)(b1=(identity)1)-这将如何工作?这是一个残破的参考!

解决方案

  1. 修复示例数据
  2. 在线放置FK(WITH CHECK

它将起作用

| a1 | a2 | a3 | a4 |    a5 |    a6 |
|----|----|----|----|-------|-------|
|  5 |  1 |  1 |  4 | hello | 38.32 |


| b1 | b2 | b3 |         b4 |         b5 |
|----|----|----|------------|------------|
| (*)|  5 |  1 | 45         | 1980-12-17 |

http://sqlfiddle.com/#!18/2ea6b/5