Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено. Не видите, как это возможно? - PullRequest
0 голосов
/ 11 марта 2020

Я новичок в SQL и прочитал некоторые другие примеры этой ошибки, но, похоже, не могу обернуться вокруг нее. Вот мои фиктивные данные.

Я создал таблицу и назвал ее blogPosts

CREATE TABLE blogPosts (
    blog_id INT PRIMARY KEY AUTO_INCREMENT,
    author_id INT DEFAULT 1,
    blog_title VARCHAR(200),
    date_created DATE,
    genre VARCHAR(20)
);

Затем я создал таблицу и назвал ее author:

CREATE TABLE author (
    author_id INT PRIMARY KEY AUTO_INCREMENT,
    author_name VARCHAR(75)
);

I затем создал внешний ключ для blogPosts, который ссылался на таблицу author с помощью author_id, и он работал без проблем!

ALTER TABLE blogPosts ADD FOREIGN KEY(author_id)
REFERENCES author(author_id) ON DELETE SET NULL;

enter image description here

Вот моя проблема. Когда я создал эту новую таблицу под названием жанры, я попытался сделать то же самое и создать внешний ключ из blogPosts и связать его с первичным ключом таблицы жанров, но это не удалось.

  CREATE TABLE genres(
        genre_name VARCHAR(20) UNIQUE PRIMARY KEY
    );
ALTER TABLE blogPosts ADD FOREIGN KEY(genre) REFERENCES genres(genre_name) ON DELETE SET NULL;

ER_NO_REFERENCED_ROW_2: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (dunder_mifflin. #sql-6454_2c, CONSTRAINT blogposts_ibfk_2 FOREIGN KEY (genre) ССЫЛКИ genres (genre_name) ВКЛЮЧЕНО, УДАЛИТЬ SET NULL)

Я действительно понятия не имею, почему это происходит. Любой совет будет принята с благодарностью, спасибо!

Ответы [ 2 ]

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

MySQL (обычно **) пытается применить ограничение внешнего ключа при создании ограничения. Если в ссылочных полях уже есть данные, ссылочные поля должны содержать эти комбинации значений, иначе ограничение не может быть применено.

** Отключение foreign_key_checks может разрешить создание ограничений без проверки наличия данных, на которые ссылаются, но их повторное включение не будет пытаться принудительно применить какие-либо нарушения ограничения после грани, оставляя ваши данные в несколько ненадежное состояние (фактически не соответствует ограничениям).

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

Ваш код работает нормально на MySQL, вот для него dbfiddle: https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=9d76943aacfd4acbe84dd060dbfa7c59

CREATE TABLE blogPosts (
    blog_id INT PRIMARY KEY AUTO_INCREMENT,
    author_id INT DEFAULT 1,
    blog_title VARCHAR(200),
    date_created DATE,
    genre VARCHAR(20)
);
CREATE TABLE author (
    author_id INT PRIMARY KEY AUTO_INCREMENT,
    author_name VARCHAR(75)
);

ALTER TABLE blogPosts ADD FOREIGN KEY(author_id)
REFERENCES author(author_id) ON DELETE SET NULL;

CREATE TABLE genres(
        genre_name VARCHAR(20) UNIQUE PRIMARY KEY
    );

ALTER TABLE blogPosts ADD FOREIGN KEY(genre) REFERENCES genres(genre_name) ON DELETE SET NULL;

insert into author(author_name) values ('Ritchie');

insert into genres (genre_name) values ('CS');


insert into blogPosts (author_id, blog_title, genre) values (1, 'Give me a beer, but not a Corona', 'CS');


select * from blogPosts;

select * From author;

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