MySQL On Delete Cascade удаляет все - PullRequest
1 голос
/ 11 апреля 2019

Итак, у меня есть родительская таблица (пользователи) и несколько дочерних таблиц, которые ссылаются на нее с помощью FK.Прямо сейчас, все мои дочерние таблицы имеют свои FK, как на каскаде удаления, потому что, очевидно, если пользователь удаляется, я хочу, чтобы все его дочерние элементы были убиты.Моя проблема в том, что, например, если у меня есть 5 записей в моей пользовательской таблице, и я удаляю 1 из них, все записи в моих дочерних таблицах удаляются, включая записи для других 4 записей.Как сделать так, чтобы уничтожались только дети удаленного пользователя.

Родительская таблица

CREATE TABLE `user_gameworlds` 
( `PlayerId_FK` int(11) DEFAULT NULL,
  `GameId_FK` int(11) DEFAULT NULL,
 `Join_Date` timestamp NULL DEFAULT NULL,
 `Login_Time` timestamp NULL DEFAULT NULL, 
 `Last_Update_Time` timestamp NULL DEFAULT NULL, 
  KEY `PlayedId_FK_idx` (`PlayerId_FK`),
  KEY `GameId_FK_idx` (`GameId_FK`),
  CONSTRAINT `GameId_FK` FOREIGN KEY (`GameId_FK`) REFERENCES `game_world` (`GameId`),
  CONSTRAINT `PlayedId_FK` FOREIGN KEY (`PlayerId_FK`) REFERENCES `users` (`PlayerId`) ON DELETE CASCADE)
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci'

Оператор выбора родительской таблицы

Дочерняя таблица

CREATE TABLE `province` (
`ProvinceId` int(11) NOT NULL AUTO_INCREMENT,
`province_FK_PlayerId` int(11) DEFAULT NULL,
`province_FK_GameId` int(11) DEFAULT NULL,
`Capital` tinyint(4) DEFAULT NULL,
`Name` varchar(45) DEFAULT 'Province',
`Population` int(11) DEFAULT NULL,
`Morale` int(11) DEFAULT NULL,
PRIMARY KEY (`ProvinceId`),
KEY `province_FK_PlayerId_idx` (`province_FK_PlayerId`),
KEY `province_FK_GameId_idx` (`province_FK_GameId`),
CONSTRAINT `province_FK_GameId` FOREIGN KEY (`province_FK_GameId`) REFERENCES `user_gameworlds` (`GameId_FK`) ON DELETE CASCADE,
CONSTRAINT `province_FK_PlayerId` FOREIGN KEY (`province_FK_PlayerId`) REFERENCES `user_gameworlds` (`PlayerId_FK`) ON DELETE CASCADE
 )  ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Оператор выбора дочерней таблицы

УДАЛЕНИЕ ЗАЯВЛЕНИЯ

Delete from user_gameworlds where PlayerId_FK = 9;

Выбор родительской таблицы после удаления

Выбор дочерней таблицы после удаления


РЕДАКТИРОВАТЬ: Для тех, кто читает это, ответ на эту проблему НЕ с использованием 2 отдельных FK, но преобразование вашей таблицы в составнойпервичный ключ

1 Ответ

1 голос
/ 11 апреля 2019

С mysql docs

CASCADE: Удалить или обновить строку из родительской таблицы, а также автоматически удалить или обновить соответствующие строки в дочерней таблице.Поддерживаются как ON DELETE CASCADE, так и UPDATE CASCADE.Между двумя таблицами не следует определять несколько предложений ON UPDATE CASCADE, которые действуют на один и тот же столбец в родительской таблице или в дочерней таблице.

Если предложение FOREIGN KEY определено для обеих таблиц в отношении внешнего ключа,Для того чтобы сделать обе таблицы родительскими и дочерними, подпункты ON UPDATE CASCADE или ON DELETE CASCADE, определенные для одного предложения FOREIGN KEY, должны быть определены для другого, чтобы каскадные операции выполнялись успешно.Если подпункт ON UPDATE CASCADE или ON DELETE CASCADE определен только для одного предложения FOREIGN KEY, каскадные операции завершаются ошибкой.

Ваше ограничение

CONSTRAINT `province_FK_GameId` FOREIGN KEY (`province_FK_GameId`)
REFERENCES `user_gameworlds` (`GameId_FK`) ON DELETE CASCADE

вызывает дальнейшее удалениеигроки из user_gameworlds (из той же игры, что и игрок, которого вы удаляете), и те вызывают больше удалений из провинции.

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