所以我有一个父表(用户)和一堆子表,它们用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;
Parent Table select after delete
Child table select after delete
答案 0 :(得分:1)
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(与您要删除的玩家相同的游戏)中进一步删除玩家,并导致从省份中删除更多玩家。