无法删除FK / Constraint(索引)

时间:2011-11-15 06:48:45

标签: mysql

我有一张表(见下文),其中我将一个复合foreig键添加到另一个表中。我无法向此表添加行,因为外键失败,即使父键具有包含复合索引值的记录...因此该表当前为空。

实际上不需要外键,系统只需要一个Fk到另一个表ID,所以我尽力删除外键无效,总是让infamus 150错误。

尝试停止foregn键检查,然后删除索引,列,bur无法删除

这可能是表......

CREATE TABLE `Servicios` (
 `Servicio_ID` int(10) unsigned NOT NULL auto_increment,
 `SolSer_ID` int(10) unsigned NOT NULL,
 `ConsecutivoServicio` int(10) unsigned default NULL,
 `ServicioAnt_ID` int(10) unsigned default NULL,
 `FechaAsignada` date NOT NULL COMMENT 'Fecha Asignada para el servicio',
 `HoraAsignada` time NOT NULL COMMENT 'Hora Asignada para hacer el servicio',
 `FechaServicio` date default NULL,
 `HoraServicio` time default NULL,
 `Tecnico_ID` int(10) unsigned NOT NULL,
 `Eq_ID` int(10) unsigned default NULL,
 `ObjetoReporte_ID` int(10) unsigned NOT NULL,
 `TipoFalla_ID` int(10) unsigned NOT NULL,
 `EnergiaRegulada` enum('Si','No') collate utf8_spanish_ci NOT NULL,
 `EstadoAlLlegar` varchar(500) collate utf8_spanish_ci default NULL,
 `DiagnosticoFalla` varchar(500) collate utf8_spanish_ci default NULL,
 `SolProp` varchar(500) collate utf8_spanish_ci default NULL,
 `Observaciones` varchar(500) collate utf8_spanish_ci default NULL,
 `ResultadoServ_ID` int(10) unsigned default NULL,
 `RetiroEquipo` enum('No','Si') collate utf8_spanish_ci default NULL,
 `EstatusServ_ID` int(10) unsigned default NULL,
 `RecibeServicioInt` int(10) unsigned default NULL,
 `PuestoRecibeInt` int(10) unsigned default NULL,
 `FechaRecibe` date default NULL,
 `HoraRecibe` time default NULL,
 `EstatusSolServ_ID` int(10) unsigned NOT NULL,
 `Empresa_ID` int(10) unsigned NOT NULL,
 `Empleado_ID` int(10) unsigned NOT NULL,
 PRIMARY KEY  (`Servicio_ID`),
 UNIQUE KEY `FK_Servicios_SolServicio2` (`SolSer_ID`,`Empresa_ID`),
 KEY `Tecnicos` (`Tecnico_ID`),
 KEY `FK_Servicios_ResultadosServicio` (`ResultadoServ_ID`),
 KEY `FK_Servicios_EstatusSolServicios` (`EstatusSolServ_ID`),
 KEY `FK_Servicios_Servicios` (`ServicioAnt_ID`),
 KEY `FK_Servicios_EstatusServicio` (`EstatusServ_ID`),
 KEY `FK_Servicios_TiposFalla` (`TipoFalla_ID`),
 KEY `FK_Servicios_ObjetoReporte` (`ObjetoReporte_ID`),
 KEY `FK_Servicios_Equipos` (`Eq_ID`),
 KEY `FK_Servicios_Empleados` (`Empleado_ID`),
 KEY `Empresa_ID` (`Empresa_ID`),
 **CONSTRAINT `FK_Servicios_SolServicio` FOREIGN KEY (`SolSer_ID`, `Empresa_ID`) REFERENCES `solservicio` (`SolSer_ID`, `Empresa_ID`),**
 CONSTRAINT `Servicios_ibfk_37` FOREIGN KEY (`SolSer_ID`) REFERENCES `SolServicio` (`SolSer_ID`),
 CONSTRAINT `Servicios_ibfk_38` FOREIGN KEY (`Tecnico_ID`) REFERENCES `Empleados` (`Empleado_ID`),
 CONSTRAINT `Servicios_ibfk_39` FOREIGN KEY (`ObjetoReporte_ID`) REFERENCES `ObjetoReporte` (`ObjetoReporteID`),
 CONSTRAINT `Servicios_ibfk_40` FOREIGN KEY (`TipoFalla_ID`) REFERENCES `TiposFalla` (`TipoFalla_ID`),
 CONSTRAINT `Servicios_ibfk_41` FOREIGN KEY (`ResultadoServ_ID`) REFERENCES `ResultadosServicio` (`ResServ_ID`),
 CONSTRAINT `Servicios_ibfk_42` FOREIGN KEY (`EstatusServ_ID`) REFERENCES `EstatusServicio` (`EstatusServ_ID`),
 CONSTRAINT `Servicios_ibfk_43` FOREIGN KEY (`EstatusSolServ_ID`) REFERENCES `EstatusSolServicios` (`EstatusSolServ_ID`),
 CONSTRAINT `Servicios_ibfk_44` FOREIGN KEY (`Empresa_ID`) REFERENCES `Empresas` (`Empresa_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci

以粗体显示的违规约束。我试过了

SET foreign_key_checks = 0;

ALTER TABLE `Servicios` DROP FOREIGN KEY `FK_Servicios_SolServicio2`;

ALTER TABLE `Servicios` DROP INDEX `FK_Servicios_SolServicio2`;

但继续得到:

#1025 - Error on rename of './segucom_SS8/#sql-2ca6_af6829' to './segucom_SS8/Servicios' (errno: 150)

有趣的是,create table将此约束称为FK_Servicios_SolServicio,而不是:FK_Servicios_SolServicio2(最后缺少2)

这是另一张表

CREATE TABLE SolServicio(  SolSer_ID int(10)unsigned NOT NULL auto_increment,  Empresa_ID int(10)unsigned NOT NULL,  FechaSolicitud datetime NOT NULL,  HoraSolicitud时间非空,  Solicito varchar(20)整理utf8_spanish_ci NOT NULL,  SolVia_ID int(10)unsigned NOT NULL,  DescripcionFalla varchar(264)整理utf8_spanish_ci NOT NULL,  Empleado_ID int(10)unsigned NOT NULL,  TipoServ_ID int(10)unsigned NOT NULL,  EstatusSolServ_ID int(10)unsigned NOT NULL,  ServicioInicial int(10)无符号默认值NULL,  PRIMARY KEY(SolSer_IDEmpresa_ID),  KEY IX_SolServicio2Empleado_ID),  KEY IX_SolServicio3Empresa_ID),  KEY FK_SolServicio_TiposServicioTipoServ_ID),  KEY FK_SolServicio_EstatusSolServiciosEstatusSolServ_ID),  KEY FK_SolServicio_SolicitudViaSolVia_ID),  KEY FK_SolServicio_EmpleadosEmpleado_ID),  约束SolServicio_ibfk_1外键(Empresa_ID)参考EmpresasEmpresa_ID),  约束SolServicio_ibfk_2外键(SolVia_ID)参考SolicitudViaSolVia_ID),  约束SolServicio_ibfk_3外键(Empleado_ID)参考EmpleadosEmpleado_ID),  约束SolServicio_ibfk_4外键(TipoServ_ID)参考TiposServicioTipoServ_ID),  约束SolServicio_ibfk_5外键(EstatusSolServ_ID)参考EstatusSolServiciosEstatusSolServ_ID) )ENGINE = InnoDB AUTO_INCREMENT = 7 DEFAULT CHARSET = utf8 COLLATE = utf8_spanish_ci

2 个答案:

答案 0 :(得分:0)

编辑:抱歉没读过你已经尝试过这个

尝试

SET foreign_key_checks = 0;
ALTER TABLE `Servicios` DROP FOREIGN KEY `FK_Servicios_SolServicio2`;
SET foreign_key_checks = 1;

答案 1 :(得分:0)

嗯,对我而言,这看起来像是一个错字:你有一个唯一的密钥,其中包含你试图删除的外键的名称(FK_Servicios_SolServicio2)。并且您有一个名为FK_Servicios_SolServicio的外键,您在脚本中标记为**。显然,您无法使用DROP FOREIGN KEY删除唯一键。我建议再试一次

ALTER TABLE `Servicios` DROP FOREIGN KEY `FK_Servicios_SolServicio`;