Разве невозможно иметь контрольное ограничение, ссылающееся на столбец, который также имеет внешний ключ? - PullRequest
2 голосов
/ 22 апреля 2020

Я на MySQL 8 пытаюсь добавить проверочное ограничение:

ALTER TABLE `table` ADD CHECK (
    (`column_a` IS NULL AND `column_b` IS NOT NULL) OR
    (`column_a` IS NOT NULL AND `column_b` IS NULL)
);

, но я продолжаю получать эту ошибку :

Столбец 'column_b' нельзя использовать в проверочном ограничении 'table_chk_1': необходимо в ссылочном действии ограничения внешнего ключа 'table_ibfk_2'.

Я не могу найти ссылки на эту ошибку где-либо еще в rnet и я не понимаю, в чем проблема. И column_a, и column_b также являются внешними ключами для других таблиц, и они оба могут иметь значение NULL. Я просто хочу убедиться, что каждая строка в table имеет ссылку через column_a или через column_b.

В чем причина этой ошибки?


Что я пробовал

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

1 Ответ

2 голосов
/ 22 апреля 2020

Это задокументированное поведение :

Ссылочные действия по внешнему ключу (ON UPDATE, ON DELETE) запрещены для столбцов, используемых в ограничениях CHECK. Аналогично, ограничения CHEC K для столбцов, используемых в ссылочных действиях внешнего ключа, запрещены.

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

...