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