(错误?)InnoDB MySQL错误1025,错误150外键

时间:2013-02-26 22:22:22

标签: mysql innodb

我有一张桌子,其主键是我要改变的。 这是表格定义。

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 KEYId。当我试图放弃它时,我得到了..

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。

编辑:这个问题没有得到解决,它已经解决了

问题只能在我们将数据库迁移到更新的服务器(相同的mysql版本)时才能得到纠正,似乎存在对ghost外键(fk_tbl_employee_shift_tbl_customer1)的破坏/重影引用,这会阻止列被删除。由于这个破坏/ ghostfk不在新服务器中,所以我可以放弃列,没有问题。我的猜测是这是一个错误,但不幸的是我无法重新创建它。

4 个答案:

答案 0 :(得分:3)

foreign_key_checks设置为0时,听起来好像丢了tbl_employee_shift

  

foreign_key_checks设置为0也会影响数据定义语句:DROP SCHEMA删除模式,即使它包含具有模式外部表引用的外键的表,DROP TABLE删除具有其他表引用的外键的表。

由于记录了这种行为,因此必须考虑设计,因此不应该是错误。

答案 1 :(得分:1)

外键配置错误时会发生错误。 SQL是正确的,我在我的localhost中运行脚本,我得到同样的错误。 解决方案是验证表tbl_person是使用引擎“InnoDB”创建的。

问候

答案 2 :(得分:0)

今天刚刚解决了这个问题。任何架构信息表中都没有两个受影响的表的迹象。我搜索各种系统数据库寻找FK,但无济于事。最后,立即停止数据库工作。

答案 3 :(得分:-1)

我有一个类似的错误,mysql需要的是你有密钥和外来,类型和大小匹配, 例如。 person.id int(10)必须映射到(10)中的service_customer.person_id 如果类型和大小不同,mysql会抱怨。