Как, вероятно, атрибут со значением NULL может ссылаться на другой атрибут в MySQL - PullRequest
1 голос
/ 23 сентября 2011

Представьте себе таблицу MySQL, описывающую папки в файловой системе:

folder_id INT,
parent_folder_id INT,
folder_name VARCHAR(64)

И я хочу добавить ограничение 'parent_folder_id REFERENCES folder_id', чтобы убедиться, что в БД нет мертвых ссылок.

Но если папка находится на верхнем уровне, родительская папка отсутствует, поэтому она должна быть NULL.Насколько я понимаю, ограничение не позволит мне вставить кортеж с parent_folder_id = NULL.

Как правильно его спроектировать?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

Вы можете просто добавить внешний ключ:

CREATE TABLE `folder` (
    `folder_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    `parent_folder_id` INTEGER UNSIGNED,
    `folder_name ` VARCHAR(64) NOT NULL,
    CONSTRAINT `PK_folder` PRIMARY KEY (`folder_id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `folder` ADD CONSTRAINT `FK_folder_parent_folder` 
    FOREIGN KEY (`parent_folder_id`) REFERENCES `folder` (`folder_id`) 
    ON DELETE CASCADE ON UPDATE CASCADE;

Ограничение внешнего ключа не сработает, если parent_folder_id равно NULL.

2 голосов
/ 23 сентября 2011

Я думаю, вам лучше использовать два триггера (один при вставке и один при обновлении), проверяющий, что parent_folder_id существует в вашей таблице в столбце folder_id ;если нет, выведите ошибку или откажитесь от операции вставки / обновления.
Для корневой папки назначьте parent_folder_id = 0 и используйте оператор CASE в своем триггере, чтобы сделать его действительным. РЕДАКТИРОВАНИЕ: использовать это как псевдокод

CREATE TRIGGER trig_ins BEFORE INSERT ON table
  FOR EACH ROW BEGIN
    IF (NEW.parent_folder_id > 0) THEN
      IF (SELECT COUNT(folder_id) FROM table 
          WHERE folder_id = NEW.parent_folder_id) = 0 THEN
              raise_an_error_here
      END
    END
  END
0 голосов
/ 23 сентября 2011

Я должен просто добавить запись в таблицу папок, называемую «root», для которой parent_folder сам. Но я никогда не проверял это и не знаю, примет ли система это.

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