2013-02-26 2 views
3

У меня есть таблица, основной ключ которой я пытаюсь изменить. Это определение таблицы.(Ошибка?) Ошибка 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 не был на новом сервере, я мог бы удалить столбец без проблем. Я предполагаю, что это была ошибка, но, к сожалению, я не могу ее воссоздать.

+0

Когда таблица tbl_employee_shift была удалена? До или после попытки удалить первичный ключ tbl_customer? – berty

+0

tbl_employee_shift был сброшен за несколько недель до того, как попытался изменить первичный ключ tbl_customer. – Snivs

+0

tbl_person создается с помощью механизма хранения innnoDB. Если вы считаете, что это неверно, просмотрите мой SQL. Насколько я знаю, это правильно. Это кажется совершенно неожиданным поведением, поскольку PK нельзя удалить из-за ссылки FK на него, но ссылка была ранее удалена. Даже если это так, то же самое точное FK можно воссоздать и отредактировать. И после того, как это будет сделано, ссылка по-прежнему предотвращает отказ ПК от ... – Snivs

ответ

3

Это звучит, как если бы вы упали tbl_employee_shift в то время как foreign_key_checks был установлен в 0:

Установка foreign_key_checks к 0 также влияет на операторы определения данных: DROP SCHEMA капель схемы, даже если она содержит таблицы, которые имеют внешние ключи, которые упоминаются к таблицам вне схемы, а DROP TABLE отбрасывает таблицы с внешними ключами, на которые ссылаются другие таблицы.

Поскольку это поведение задокументировано, оно должно рассматриваться как по дизайну и, следовательно, не является ошибкой.

+0

Это имеет смысл! ... но даже если это так, почему это позволяет мне воссоздать и отбросить и таблицу, и внешний ключ, а foreign_key_checks - 1? Редактирование: Кроме того, когда я бросаю воссозданный fk, ссылка по-прежнему считается существующей InnoDB .. – Snivs

1

Ошибка возникает, если внешний ключ плохо сформулирован. SQL правильный, я запускаю скрипт в своем локальном хосте, я получаю такую ​​же ошибку. Решение проверяет, что таблица tbl_person была создана с движком «InnoDB».

привет

+0

tbl_person создается с помощью механизма хранения innnoDB. Если вы считаете, что это неверно, просмотрите мой SQL. Насколько я знаю, это правильно. Это кажется совершенно неожиданным поведением, поскольку PK нельзя удалить из-за ссылки FK на него, но ссылка была ранее удалена. Даже если это так, то же самое точное FK можно воссоздать и отредактировать. И после того, как это будет сделано, ссылка все еще предотвращает падение PK ... – Snivs

+1

Я получаю ту же ошибку, я решил изменить таблицу tbl_person, которая была создана с помощью myisam. разница между вашими таблицами и моей состоит в том, что таблица tbl_person находится в одной базе данных с tbl_customer. Я надеялся, что это поможет вам. извините за мой английский – chenio

+0

Спасибо, Chenio, но эти таблицы действительно динамичны и не могут измениться до Myisam, думаю, мне придется планировать, как воссоздать всю базу данных во время планового обслуживания, может быть, поэтому я также могу воссоздать внутреннюю версию InnoDB каталог ... без этого зомби FK – Snivs

-1

У меня была подобная ошибка, то, что MySQL требует, что у вас есть как ключ и иностранный, тип и размер, спичку для например. person.id int (10) должен отображаться в service_customer.person_id в (10) , если тип и размер отличаются, mysql будет жаловаться.

+0

Несвязанный, FK был сброшен, но он по-прежнему считается существующим .. и это не MySQL, это движок InnoDB Storage. – Snivs

0

Только что справился с этой проблемой сегодня. В любой таблице таблиц схемы не было признаков двух затронутых таблиц.Я искал различные системные базы данных, ищущие FK, безрезультатно. В итоге сбрасывание базы данных работало мгновенно.