MySQL在删除级联删除所有内容

时间:2019-04-11 15:59:57

标签: mysql sql

所以我有一个父表(用户)和一堆子表,它们用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'

Parent table select statement

子表

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

Child table select statement

删除声明

Delete from user_gameworlds where PlayerId_FK = 9;

Parent Table select after delete

Child table select after delete


编辑:对于阅读此书的任何人,此问题的答案不是使用2个单独的FK,而是将表转换为使用复合主键

1 个答案:

答案 0 :(得分:1)

来自mysql docs

  

CASCADE:从父表中删除或更新行,并自动删除或更新子表中匹配的行。同时支持ON DELETE CASCADE和ON UPDATE CASCADE。在两个表之间,不要定义几个作用于父表或子表中同一列上的ON UPDATE CASCADE子句。

     

如果两个表中的外键都定义了FOREIGN KEY子句   关系,使两个表都成为父表和子表,并进行ON UPDATE   为一个FOREIGN KEY定义的CASCADE或DELETE CASCADE子条款   必须为另一个定义子句以便进行级联操作   成功。如果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(与您要删除的玩家相同的游戏)中进一步删除玩家,并导致从省份中删除更多玩家。