Каскадное удаление удаляет нежелательные записи - PullRequest
0 голосов
/ 19 марта 2012

Я обычно разрабатываю в MS Access и иногда подключаюсь к бэкэнду MySQL. У меня есть серверная часть MySQL, которая не выполняет каскадное удаление, как я ожидаю, когда удаляю записи. Мне интересно, если это из-за того, как я установил отношения таблицы (внешние ключи). Я не знаю достаточно о MySQL, чтобы знать, правильно ли я это сделал. В представлении конструктора я установил отношения, используя представление конструктора в MySQL. Для составного поля первичного ключа (InterviewID, Coder ID) в tblInterviews я создал два отдельных отношения к tblSB для каждого из этих двух полей первичного ключа (tblSB включает 3-е поле, SBid, в качестве составного PK). Представление конструктора немного отличается от Access тем, что вы не можете выделить более одного поля за раз, чтобы установить отношения. Я нашел форумы, на которых обсуждается синтаксис для установки отношений с внешним ключом, но я не знаю, эквивалентно ли это тому, что я делал в конструкторе. Я подозреваю, что нет, потому что в настоящее время, когда я пытаюсь удалить конкретную запись (уникальная комбинация InterviewID, CoderID) ALL записи интервью для CoderID в комбинации InterviewID, CoderID удаляются (и это распространяется на другие дочерние таблицы как Что ж). Мне также интересно, нужно ли мне настроить мой первичный ключ так, как я сейчас не делаю (например, настроить его как индекс). Любая помощь будет оценена. Заранее спасибо.

1 Ответ

0 голосов
/ 19 марта 2012

Чтобы увидеть, что вы создали, посмотрите на DDL. (ПОКАЗАТЬ СОЗДАТЬ СТОЛ)

Для применения ограничений внешнего ключа - включая каскадное удаление - вы, вероятно, захотите использовать механизм innodb. Механизм myisam будет принимать DDL, который объявляет внешние ключи, но не применяет их.

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

Отклонение от стандартов SQL: ограничение FOREIGN KEY, которое ссылается на неуникальный ключ не является стандартным SQL. Это расширение InnoDB для стандартный SQL.

Они называют это расширением SQL. Я называю это ошибкой.

Это означает, что вы можете объявить tblSB.interviewID как внешний ключ, ссылающийся на tblInterviews.interviewID. Стандартные базы данных SQL не позволят этого.

5,6 документов скажем

Однако система не обеспечивает выполнение требования, на которое ссылается столбцы будут УНИКАЛЬНЫМИ или будут объявлены НЕ ПУСТО. Обработка внешнего ключа ссылки на неуникальные ключи или ключи, содержащие значения NULL, не являются хорошо определены для таких операций, как ОБНОВЛЕНИЕ или УДАЛЕНИЕ КАСКАДА. Вы Рекомендуется использовать внешние ключи, которые ссылаются только на UNIQUE и NOT NULL ключи.

На мой взгляд, они говорят: «Это была плохая идея, но мы не знаем, как ее исправить. Поэтому вам решать, как этого избежать. Мы могли бы предупредить вас, когда вы попробуете это, но мы тоже не собираемся этого делать. "


На основании ваших комментариев я бы сказал, что это ограничение верно. , .

CONSTRAINT tblInterviewRecordtblSB 
FOREIGN KEY (InterviewID, CoderID) 
  REFERENCES tblinterviewrecord (InterviewID, CoderID) 
  ON DELETE CASCADE ON UPDATE CASCADE

но этих двух нет, и их следует удалить.

CONSTRAINT tblSB_ibfk_1 
FOREIGN KEY (InterviewID) 
  REFERENCES tblinterviewrecord (InterviewID) 
  ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT tblSB_ibfk_2 
FOREIGN KEY (CoderID) 
  REFERENCES tblinterviewrecord (CoderID) 
  ON DELETE CASCADE ON UPDATE CASCADE
...