mysql: при обновлении каскада, при удалении установлен ноль не работает - PullRequest
0 голосов
/ 26 марта 2020

У меня есть две таблицы, как показано ниже:

CREATE TABLE Movies ( 
    title varchar(100) NOT NULL, 
    year YEAR NOT NULL, 
    length int NOT NULL,  
    genre ENUM('action', 'adventure', 'comedy', 'family', 'crime', 'drama', 'fantasy', 'historical') NOT NULL, 
    studioName varchar(100) NOT NULL,  
    producerCNum int REFERENCES MoviesExec(certNum)
        ON DELETE SET NULL
        ON UPDATE CASCADE, 
    PRIMARY KEY (title, year) 
);

CREATE TABLE MoviesExec ( 
    name varchar(200) NOT NULL, 
    address varchar(100) NOT NULL, 
    certNum int NOT NULL,   
    netWorth int NOT NULL, 
    PRIMARY KEY (certNum) 
);

Чтобы проверить операторы «ON DELETE» и «ON UPDATE», я вставил по одной строке в Movies и одну строку в MoviesExe c , В Movies я вставил:

INSERT INTO Movies
VALUES('star wars', 1977, 142, 'action', 'lucasfilm', 12345);

В MoviesExe c, я вставил:

INSERT INTO MoviesExec
VALUES('george lucas', '100 beverly hills', 12345, 1000000);

Затем я попытался обновить certNum для MoviesExe c, который должен был привести к изменению источникаCNum of Movies:

UPDATE MoviesExec SET certNum = 1234567 where name = 'george lucas'; 

Обновление отображается в MoviesExe c с certNum, теперь равным 1234567, но когда я делаю

SELECT * FROM Movies

ManufacturerCNum все еще равен 12345. Что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Наконец-то разобрался. В MySQL документах говорится:

"MySQL анализирует, но игнорирует« встроенные спецификации ссылок »(как определено в стандарте SQL), где ссылки определены как часть спецификации столбца. MySQL принимает предложения REFERENCES только в том случае, если они указаны как часть отдельной спецификации FOREIGN KEY "

Так что раньше я занимался встроенной спецификацией REFERENCES. Мне пришлось указать предложения REFERENCES в спецификации FOREIGN KEY, что я и сделал ниже:

ALTER TABLE Movies
ADD CONSTRAINT producer_fk
FOREIGN KEY (producerCNum) REFERENCES MoviesExec(certNum) ON UPDATE CASCADE;

ALTER TABLE Movies
ADD CONSTRAINT producer_fk2
FOREIGN KEY (producerCNum) REFERENCES MoviesExec(certNum) ON DELETE SET NULL;
0 голосов
/ 26 марта 2020

Вы НЕ создаете ссылку на внешний ключ.

CREATE TABLE Movies ( 
    title varchar(100) NOT NULL, 
    year YEAR NOT NULL, 
    length int NOT NULL,  
    genre ENUM('action', 'adventure', 'comedy', 'family', 'crime', 'drama', 'fantasy', 'historical') NOT NULL, 
    studioName varchar(100) NOT NULL,  
    producerCNum int,
    FOREIGN KEY MoviesExec_certNum (producerCNum) REFERENCES MoviesExec (certNum)
        ON DELETE SET NULL
        ON UPDATE CASCADE, 
    PRIMARY KEY (title, year) 
);

fiddle

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