База данных SQL Server не обновляется ПО ОБНОВЛЕНИЮ КАСКАДА - PullRequest
0 голосов
/ 25 сентября 2018

У меня были проблемы с настройкой ON UPDATE CASCADE для правильной работы, я не получаю синтаксических ошибок, но при каждом обновлении tableA.a1 в tableB не происходит никаких изменений, и я не уверен, что происходит.При отображении таблицы A она была обновлена, а таблица B - нет.

Вот мой код:

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 голосов
/ 25 сентября 2018

Неправильная настройка

  • Вы применили 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. Подключить FKs онлайн (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

0 голосов
/ 25 сентября 2018

потому что вы обновляете a1, в то время как ваш внешний ключ a3 в таблице, поэтому, если вы обновляете a3, таблица 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...