ilostmyid2 Ответов: 1

Не удается определить внешний ключ


В MySQL у меня есть две таблицы:

Мониторы:
Id: INT PRIMARY KEY NOT NULL AUTOINCREMENT
Группы: ИНТ нуль
....

MonitorGroups:
Id: INT PRIMARY KEY NOT NULL AUTOINCREMENT
Имя: ВАРЧАР(50)

Мне нужно определить это ограничение:

Изменение таблицы мониторы monitor_group_fk добавить ограничение внешнего ключа (группы) ссылки MonitorGroups (ИД);

Но я получаю следующую ошибку:

Ошибка 1452 (23000): не удается добавить или обновить дочернюю строку: не удается выполнить ограничение внешнего ключа (`zm`.`#SQL и 475_1c237` ограничение `monitor_group_fk` внешний ключ (при необходимости) ссылки `MonitorGroups` (`идентификатор`))

В настоящий момент нет ни одной записи в таблице MonitorGroups и группы строк таблицы мониторы не установлены. Мне нужно, чтобы это было законно. Другими словами, Мне нужно, чтобы MySQL отслеживал поле GroupId монитора таблиц только в том случае, если оно установлено. Я хотел бы определить это ограничение следующим образом:

ALTER TABLE Monitors ADD CONSTRAINT monitor_group_fk FOREIGN KEY (GroupId) REFERENCES MonitorGroups (Id) ON UPDATE CASCADE ON DELETE SET NULL;

таким образом, если идентификатор группы (поле Id) изменился в таблице MonitorGroups, MySQL автоматически изменяет его в мониторах таблиц, а если группа была удалена из таблицы MonitorGroups, MySQL автоматически устанавливает GroupId соответствующих строк в мониторах таблиц в null. Что не так и как достичь этой цели?

Что я уже пробовал:

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

0x01AA

"Я не уверен, есть ли поддержка MySQL значение null внешний ключ": MySQL не поддерживает внешние ключи, допускающие значения null.
Проверьте еще раз мониторы вашей таблицы и убедитесь, что GroupId NULL для каждой записи.

Если это не помогает, начните снова с нуля в новой БД, чтобы проверить процесс создания таблицы.

ilostmyid2

не помочь. для создания внешнего ключа неизбежно наличие строки в таблице MonitorGroups с идентификатором 0.

0x01AA

Id == '0' это не то же самое, как Id == NULL

NULL: означает не определено
0: означает допустимое целое число

1 Ответов

Рейтинг:
2

Patrice T

То, что вы пытаетесь сделать, скорее сбивает меня с толку.
Насколько я понимаю, вы пытаетесь сделать простую вещь сложным способом, и тоже неэффективно.
Насколько я понимаю, id то есть первичный ключ и внешний ключ из другой таблицы подразумевают, что таблица может иметь 0 или 1 строку для каждой строки другой таблицы.
Один стол, как:
MonitorGroups:
Id: INT PRIMARY KEY NOT NULL AUTOINCREMENT
Имя: ВАРЧАР(50)
Группы: ИНТ нуль
было бы в основном то же самое, но проще в обращении.

Я думаю, что вам следует улучшить свои навыки проектирования баз данных.


ilostmyid2

Я вижу, что вы не поняли архитектуру. Пожалуйста, перечитайте то, что я написал. Идентификатор строки в таблице MonitorGroups - это ссылка на строку в таблице Monitors. Например, если мы хотим знать, какие мониторы определены в указанной группе, мы выполняем этот запрос:
Выберите * из мониторов, где GroupId=<id>;

0x01AA

- Я вижу, что вы не поняли архитектуру.":
Остынь! Именно вы не получаете смысла для чужеродных чопорных ключевых вещей. Это такой элементарный, легкий материал, который можно легко разгадать с минимумом усилий!