У меня есть таблица, основной ключ которой я пытаюсь изменить. Это определение таблицы.(Ошибка?) Ошибка InnoDB MySQL 1025, errno 150 Foreign Key
CREATE TABLE `tbl_customer` (
`PersonId` int(11) NOT NULL,
`Id` int(10) unsigned NOT NULL,
`Name` varchar(100) collate utf8_spanish_ci NOT NULL,
`Alias` varchar(50) collate utf8_spanish_ci NOT NULL,
`Phone` varchar(30) collate utf8_spanish_ci default NULL,
`Phone2` varchar(30) collate utf8_spanish_ci default NULL,
`Email` varchar(50) collate utf8_spanish_ci default NULL,
`Email2` varchar(50) collate utf8_spanish_ci default NULL,
`RFC` varchar(13) collate utf8_spanish_ci default NULL,
`AddressStreetName` varchar(45) collate utf8_spanish_ci default NULL,
`AddressStreetNumber` varchar(45) collate utf8_spanish_ci default NULL,
`AddressCityWard` varchar(45) collate utf8_spanish_ci default NULL,
`AddressCityName` varchar(45) collate utf8_spanish_ci default NULL,
`AddressStateName` varchar(45) collate utf8_spanish_ci default NULL,
`AddressCountryName` varchar(45) collate utf8_spanish_ci default NULL,
`AddressPostalCode` int(10) default NULL,
`IsDistributor` tinyint(1) NOT NULL default '0' COMMENT '1 = Is Distributor, 0 = Is Not Distributor',
`ParentCustomerId` int(10) NOT NULL default '11' COMMENT 'Our Id is 11, so by default, all customers right now are our children.',
PRIMARY KEY (`Id`),
KEY `fk_tbl_cliente_tbl_cliente1_idx` (`ParentCustomerId`),
KEY `fk_tbl_cliente_tbl_person1_idx` (`PersonId`),
KEY `PersonId` (`PersonId`),
KEY `PersonId_2` (`PersonId`),
CONSTRAINT `fk_tbl_cliente_tbl_cliente1` FOREIGN KEY (`ParentCustomerId`) REFERENCES `tbl_customer` (`PersonId`),
CONSTRAINT `fk_tbl_cliente_tbl_person1` FOREIGN KEY (`PersonId`) REFERENCES `zapata`.`tbl_person` (`Id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci COMMENT='''Customer'' refers to a person or entity to which we provide '$$
Теперь, когда я впервые попробовал:
ALTER TABLE `tbl_customer` DROP PRIMARY KEY;
Мои PRIMARY KEY
является Id
. Когда я попытался бросить его, я получил ..
Error Code: 1025. Error on rename of './services/#sql-29a_218cc7f' to './services/tbl_customer' (errno: 150)
Итак, я удалил все FOREIGN KEY
ограничения, указанные в этой таблице и столбце, и до сих пор получил ту же ошибку. Я также подошел к SHOW ENGINE INNODB STATUS
и выяснили следующее:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
130226 14:41:11 Error in foreign key constraint of table services/tbl_employee_shift:
there is no index in referenced table which would contain
the columns as the first columns, or the data types in the
referenced table do not match to the ones in table. Constraint:
,
CONSTRAINT fk_tbl_employee_shift_tbl_customer1 FOREIGN KEY (CustomerId) REFERENCES services.tbl_customer (Id) ON UPDATE CASCADE
Однако таблица services.tbl_employee_shift
не существует (он существовал один раз, но это было сброшено несколько недель, прежде чем я пытался это изменить). Так что я пошел дальше и ...
CREATE TABLE services.tbl_employee_shift(
CustomerId INT (11)
);
ALTER TABLE services.tbl_employee_shift ADD CONSTRAINT fk_tbl_employee_shift_tbl_customer1 FOREIGN KEY (CustomerId) REFERENCES avatar.tbl_cliente (Id);
ALTER TABLE services.tbl_employee_shift DROP FOREIGN KEY fk_tbl_employee_shift_tbl_customer1;
И это работает ... но это не исправит необходимую информацию, казалось бы, InnoDB по-прежнему считает, что ограничение fk_tbl_employee_shift_tbl_customer1
жив и, таким образом, является «предотвращение капли первичный ключ, чтобы сохранить согласованность "... Я использую MySQL 5.0.95.
EDIT: Эта проблема пошла нерешенным, он работал около
Проблема может быть исправлена только тогда, когда мы мигрировали базы данных на более новый сервер (тот же версии MySQL), кажется, что там была сломана ссылка/призраку внешний ключ призрака (fk_tbl_employee_shift_tbl_customer1), который предотвратил удаление столбца. Поскольку этот сломанный/ghostfk не был на новом сервере, я мог бы удалить столбец без проблем. Я предполагаю, что это была ошибка, но, к сожалению, я не могу ее воссоздать.
Когда таблица tbl_employee_shift была удалена? До или после попытки удалить первичный ключ tbl_customer? – berty
tbl_employee_shift был сброшен за несколько недель до того, как попытался изменить первичный ключ tbl_customer. – Snivs
tbl_person создается с помощью механизма хранения innnoDB. Если вы считаете, что это неверно, просмотрите мой SQL. Насколько я знаю, это правильно. Это кажется совершенно неожиданным поведением, поскольку PK нельзя удалить из-за ссылки FK на него, но ссылка была ранее удалена. Даже если это так, то же самое точное FK можно воссоздать и отредактировать. И после того, как это будет сделано, ссылка по-прежнему предотвращает отказ ПК от ... – Snivs