Отбросьте вопрос о возможном противоречии - PullRequest
1 голос
/ 09 декабря 2011

Я создаю две таблицы, подобные этой:

CREATE TABLE abc (
  id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(64) NOT NULL,
  created DATETIME DEFAULT '0000-00-00 00:00:00',
  updated DATETIME DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE def (
  abc_id INTEGER NOT NULL DEFAULT 0,
  name VARCHAR(64) NOT NULL,
  value LONGTEXT,
  PRIMARY KEY(name, abc_id),
  CONSTRAINT fk_def FOREIGN KEY(id)
    REFERENCES abc(id) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

, который должен сказать MySQL автоматически удалять соответствующую строку из DEF при удалении строки из ABC.

Но это не очень хорошо работает с операциями DROP. Если я пытаюсь удалить таблицу abc, я получаю сообщение об ошибке, сообщающее, что нарушение внешнего ключа не выполняется. Похоже, что мне нужно сначала удалить DEF, и только потом я могу сбросить ABC. Я не понимаю почему, потому что сброс ABC должен автоматически сбросить DEF, верно? Или хотя бы очистить его, удалив строки, соответствующие идентификатору из ABC ...

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

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

Так что да, если вы хотите удалить таблицы, вам нужно сначала удалить зависимые ограничения. Предложение внешнего ключа ON DELETE предназначено для удаления строк, а НЕ для удаления таблиц:)

1 голос
/ 09 декабря 2011

Удаление таблицы отличается от удаления строк, ограничение внешнего ключа будет каскадно выполнять операции удаления, но для фактического удаления (удаления) таблицы сначала необходимо удалить все ограничения внешнего ключа.

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