Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа завершается неудачно при попытке добавить новую строку - PullRequest
1 голос
/ 30 сентября 2019

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

Cannot add or update a child row: a foreign key constraint fails

Вот как я устанавливаю свое ограничение:

enter image description here

Так есть ли способ вставить пустое значение в поле ограничения? Если нет, что было бы лучшим решением вместо устранения ограничения?

1 Ответ

0 голосов
/ 30 сентября 2019

Так есть ли способ вставить пустое значение в поле ограничения?

Да, есть. Пока столбец, управляемый внешним ключом, не определен как NOT NULL, в него можно вставить значение NULL, как объясняется в руководстве . Недопустимо вставлять не-NULL значение, которое не существует в родительской таблице (включая пустую строку!).

MySQL по существу реализует семантику, определенную MATCH SIMPLE, которые позволяют внешнему ключу быть полностью или частично NULL. В этом случае разрешается вставка строки (дочерней таблицы), содержащей такой внешний ключ, и не соответствует ни одной строке в ссылочной (родительской) таблице.

Рассмотрим эту демонстрацию в DB Fiddlde :

-- parent table
create table parent (id int primary key);

-- child table
create table child (
    id int primary key, 
    parent_id int null,  -- allow `NULL` values
    constraint parent_id_fk foreign key(parent_id) references parent(id)
);

-- create a parent record
insert into parent(id) values(1);

-- insert a child record that references the parent: ok
insert into child(id, parent_id) values(1, 1);

-- insert a child record with a NULL parent_id : ok
insert into child(id, parent_id) values(2, NULL);

-- insert a child record with a (non-NULL) unknown parent_id
insert into child(id, parent_id) values(3, 2);
-- Error: Cannot add or update a child row: a foreign key constraint fails 
...