我在下面有两张表:
CREATE TABLE `queststatus` (
`queststatusid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`characterid` int(11) NOT NULL DEFAULT '0',
`quest` int(6) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '0',
`time` int(11) NOT NULL DEFAULT '0',
`forfeited` int(11) NOT NULL DEFAULT '0',
`customData` varchar(255) DEFAULT NULL,
PRIMARY KEY (`queststatusid`),
KEY `characterid` (`characterid`),
CONSTRAINT `queststatus_ibfk_1` FOREIGN KEY (`characterid`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2148654268 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED
和
CREATE TABLE `queststatusmobs` (
`queststatusmobid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`queststatusid` int(10) unsigned NOT NULL DEFAULT '0',
`mob` int(11) NOT NULL DEFAULT '0',
`count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`queststatusmobid`),
KEY `queststatusid` (`queststatusid`),
CONSTRAINT `queststatusmobs_ibfk_1` FOREIGN KEY (`queststatusid`) REFERENCES `queststatus` (`queststatusid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
所以,当我更新表queststatus的queststatusid时,我使用这些命令,因为queststatusid达到INT的最大值:
SET foreign_key_checks = 1;
SET @newid=0;
UPDATE queststatus SET queststatusid=(@newid:=@newid+1) ORDER BY queststatusid;
这个命令应该使表queststatusmobs的queststatusid在表queststatus更新的queststatusid时更改,但它没有。 它显示:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`twms`.`queststatus`, CONSTRAINT `queststatus_ibfk_1` FOREIGN KEY (`characterid`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
我已经删除了所有无用的外键,而不是在queststatus中首先使用此命令:
DELETE FROM queststatusmobs WHERE queststatusid not in (SELECT queststatusid FROM queststatus);
我该如何解决这个问题?
答案 0 :(得分:0)
你的角色表上没有特定的ID。
首先插入字符表id并将该id用作queststatus表上的外键。
或者
从queststatus中删除外键引用。
答案 1 :(得分:0)
如果你有一个外键,你可能无法更改id,因为它反之亦然。您将必须禁用外键检查或考虑将数据类型更改为BIGINT。这将是最合适的事情,而不是试图修改数据。
禁用外键检查:
SET foreign_key_checks = 0;
否则你可以删除并创建外键