составной первичный ключ как внешний ключ, удаляющий один набор удаляет все - PullRequest
0 голосов
/ 03 марта 2019

У меня есть две таблицы, одна из которых имеет составной первичный ключ, а другая имеет внешние ключи к нему.Они оба настроены на каскад при удалении.Проблема в том, что когда я удаляю, скажем, скажем, составной ключ набор "имя: Джон дата: 02.02.2018" из основной таблицы, все строки Джона удаляются из таблицы с внешними ключами, но может быть установлен "имя: Джондата: 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 Ответ

0 голосов
/ 03 марта 2019

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

Попробуйте:

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) в зависимости от порядка этих столбцов впервичный ключ, определенный в ссылочной таблице.

...