更新外键时出现MySQL错误

时间:2016-10-21 01:25:05

标签: mysql

我在下面有两张表:

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);

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

你的角色表上没有特定的ID。

首先插入字符表id并将该id用作queststatus表上的外键。

或者

从queststatus中删除外键引用。

答案 1 :(得分:0)

如果你有一个外键,你可能无法更改id,因为它反之亦然。您将必须禁用外键检查或考虑将数据类型更改为BIGINT。这将是最合适的事情,而不是试图修改数据。

禁用外键检查:

SET foreign_key_checks = 0;

否则你可以删除并创建外键