#mysql
#mysql
Вопрос:
У меня есть 2 таблицы, приведенные ниже:
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;
Итак, когда я обновляю queststatusid таблицы queststatus, я использую эту команду, потому что queststatusid достиг максимального значения INT:
SET foreign_key_checks = 1;
SET @newid=0;
UPDATE queststatus SET queststatusid=(@newid:=@newid 1) ORDER BY queststatusid;
эта команда должна изменять queststatusid таблицы queststatusmobs при обновлении queststatusid таблицы queststatus, но этого не происходит.
Это показывает:
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);
Как я могу решить эту проблему?
Комментарии:
1. С какой стати вы хотите вручную изменить ключ auto_increment?
2. поскольку ключ auto_increment достигает максимального значения INT, но я не могу изменить свою программу.
3. Я не думаю, что вы предоставили полную картину. Ваша ошибка связана с
characters
таблицей, а неqueststatusmobs
. Я подозреваю, что у вас есть строки вqueststatus
с поддельными идентификаторами дляcharacterid
.4. Я решил эту проблему.
5. Просто удалите ссылочный символ внешнего ключа id
Ответ №1:
У вас не было этого конкретного идентификатора, недоступного в вашей таблице символов.
Сначала вы вставляете идентификатор таблицы символов и используете этот идентификатор в качестве внешнего ключа в таблице queststatus.
Или
Удалите ссылку на внешний ключ из queststatus.
Комментарии:
1. Да, я создал таблицу символов ранее. но я не знаю, повлияет ли таблица символов на то, когда я обновляю таблицу queststatus?
2. таблица queststatus содержит внешний ключ таблицы characters
Ответ №2:
Возможно, вы не сможете изменить идентификатор, если у вас есть внешний ключ против него, поскольку он проверяет наоборот. Вам придется либо отключить проверки внешнего ключа, либо подумать об изменении типа данных на BIGINT. Это будет наиболее подходящим решением вместо попытки изменения данных.
Чтобы отключить проверку внешнего ключа:
SET foreign_key_checks = 0;
Или же вы можете удалить и создать внешний ключ
Комментарии:
1. спасибо, но если я УСТАНОВЛЮ foreign_key_checks = 0, внешний ключ обновляться не будет.