составной первичный ключ как внешний ключ, удаление одного набора удаляет все

#mysql #sql #heidisql

#mysql #sql #heidisql

Вопрос:

У меня есть две таблицы, одна из которых имеет составной первичный ключ, а другая имеет внешние ключи к нему. Они оба настроены на каскадное удаление. Проблема в том, что когда я удаляю, скажем, составной набор ключей «имя: John дата: 02.02.2018» из основной таблицы, все строки John удаляются из таблицы с внешними ключами, но может быть набор «имя: John дата: 04.04.2018», а также все строки, где дата 02.02.2018, также удаляются как я могу заставить его удалять строки, в которых сопоставлен только набор внешнего ключа?

Обновить:

 CREATE TABLE messages (
    session_date date NOT NULL,
    chat int(11) NOT NULL,
    message longtext NOT NULL,
    date time NOT NULL,
    receiver int(11) NOT NULL,
    PRIMARY KEY (date,receiver),
    KEY FK_messages_sessions (session_date,chat),
    KEY FK_messages_sessions_2 (chat,session_date),
    CONSTRAINT FK_messages_sessions 
        FOREIGN KEY (session_date) 
        REFERENCES sessions (session_date) 
        ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT FK_messages_sessions_2 
       FOREIGN KEY (chat) 
       REFERENCES sessions (chat) 
       ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
  

Комментарии:

1. Похоже, вы не делали внешний ключ составным. Покажите вывод SHOW CREATE TABLE для таблицы с внешними ключами.

2. @Barmar Я обновил ответ. Я попытался поместить оба столбца в индекс другого ключа, но я предполагаю, что это не так, как это делается?

3. @Barmar о, я только что понял, что я должен просто создать один внешний ключ с 2 внешними столбцами, а не помещать все столбцы в каждый ключ.. Спасибо

Ответ №1:

Вы определили два внешних ключа вместо составного внешнего ключа.

Попробуйте:

 CREATE TABLE `messages` (
  `session_date` date NOT NULL,
  `chat` int(11) NOT NULL,
  `message` longtext NOT NULL,
  `date` time NOT NULL,
  `receiver` int(11) NOT NULL,
  PRIMARY KEY (`date`,`receiver`),
  KEY `FK_messages_sessions` (`session_date`,`chat`),
  CONSTRAINT `FK_messages_sessions` 
      FOREIGN KEY (`session_date`, `chat`) 
      REFERENCES `sessions` (`session_date`, `chat`) 
      ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
  

(session_date,chat) также может быть (chat,session_date) в зависимости от порядка расположения этих столбцов в первичном ключе, определенном в таблице, на которую дана ссылка.