У меня есть таблица, которая имеет несколько столбцов ID для других таблиц.
Я хочу , чтобы внешний ключ к целостности силы только если я помещаю туда данные. Если позднее я выполню обновление, чтобы заполнить этот столбец, он также должен проверить ограничение.
(Вероятно, это зависит от сервера базы данных, я использую тип таблицы MySQL и InnoDB)
Я считаю, что это разумное ожидание, но поправьте меня, если я ошибаюсь.
sql
mysql
database
foreign-keys
клещи
источник
источник
Ответы:
Да, вы можете применить ограничение только тогда, когда значение не равно NULL. Это легко проверить с помощью следующего примера:
Первая вставка пройдет, потому что мы вставляем NULL в
parent_id
. Вторая вставка завершается неудачно из-за ограничения внешнего ключа, так как мы попытались вставить значение, которое не существует вparent
таблице.источник
parent_id INT NULL
часть (многословно) равнаparent_id int default null
int
вместо членовInteger
вашего класса, то по умолчанию никогда не будет нулевым, но будет 0, и вы нарушите ограничение.Я обнаружил, что при вставке значения нулевого столбца должны были быть специально объявлены как NULL, в противном случае я бы получил ошибку нарушения ограничения (в отличие от пустой строки).
источник
INSERT INTO {table} {list_of_columns}
? Потому что это правда для меня; Пропуск упоминания столбца приводит к ошибке, но включение и явное значение NULL исправляет ошибку. Если я прав, я думаю, что комментарий @ Gary не применим (потому что вы не имели в виду пустую строку), но @Kevin Coulombe может быть полезным ...Да, это будет работать так, как вы ожидаете. К сожалению, у меня, похоже, возникают проблемы с нахождением явного утверждения об этом в руководстве по MySQL .
Внешние ключи означают, что значение должно существовать в другой таблице. NULL относится к отсутствию значения, поэтому, когда вы устанавливаете столбец в NULL, не имеет смысла пытаться применить ограничения на это.
источник
Выше работает, но это не так. Обратите внимание на УДАЛЕННЫЙ КАСКАД
источник
Да, значение может быть NULL, но вы должны быть явным. Я уже сталкивался с такой же ситуацией и раньше, и легко забыть ПОЧЕМУ это происходит, и поэтому нужно немного вспомнить, что нужно сделать.
Если представленные данные преобразуются или интерпретируются как пустая строка, произойдет сбой. Тем не менее, явно установив значение NULL при вставке или обновлении, все готово.
Но ведь это удовольствие от программирования, не так ли? Создание собственных проблем, а затем их исправление! Ура!
источник
Другим способом было бы вставить элемент DEFAULT в другую таблицу. Например, любая ссылка на uuid = 00000000-0000-0000-0000-000000000000 в другой таблице будет указывать на отсутствие действий. Вам также нужно установить все значения для этого идентификатора как «нейтральные», например, 0, пустая строка, ноль, чтобы не влиять на логику кода.
источник
Я тоже застрял в этом вопросе. Но я решил просто, определив внешний ключ как
unsigned integer
. Найдите приведенный ниже примеристочник