【问题标题】:Can not delete FK/ Constraint (index)无法删除 FK/约束(索引)
【发布时间】:2011-12-29 06:29:23
【问题描述】:

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

确实不需要外键,系统对另一个表ID使用一个Fk就足够了,所以我尽力删除外键无济于事,总是得到infamus 150 err。

试图停止外键检查,然后删除索引,列,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)

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

这是另一张桌子

创建表SolServicio ( SolSer_ID int(10) unsigned NOT NULL auto_increment, Empresa_ID int(10) 无符号非空, FechaSolicitud 日期时间不为空, HoraSolicitud 时间不为空, Solicito varchar(20) 整理 utf8_spanish_ci NOT NULL, SolVia_ID int(10) 无符号非空, DescripcionFalla varchar(264) 整理 utf8_spanish_ci 非空, Empleado_ID int(10) 无符号非空, TipoServ_ID int(10) 无符号非空, EstatusSolServ_ID int(10) 无符号非空, ServicioInicial int(10) 无符号默认 NULL, 主键 (SolSer_ID,Empresa_ID), 键IX_SolServicio2 (Empleado_ID), 键IX_SolServicio3 (Empresa_ID), 键FK_SolServicio_TiposServicio (TipoServ_ID), 键FK_SolServicio_EstatusSolServicios (EstatusSolServ_ID), 键FK_SolServicio_SolicitudVia (SolVia_ID), 键FK_SolServicio_Empleados (Empleado_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) 参考 EstatusSolServicios (EstatusSolServ_ID) ) ENGINE=InnoDB AUTO_INCREMENT=7 默认字符集=utf8 COLLATE=utf8_spanish_ci

【问题讨论】:

  • 是的,我正在编辑我的问题添加另一个表

标签: mysql


【解决方案1】:

嗯,对我来说,这看起来像是一个错字:您有一个唯一键,其中包含您尝试删除的外键的名称 (FK_Servicios_SolServicio2)。而且您有一个名称为 FK_Servicios_SolServicio 的外键,您在脚本中用 ** 进行了标记。显然,您不能使用DROP FOREIGN KEY 删除唯一键。我建议再试一次

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

【讨论】:

    【解决方案2】:

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

    试试

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

    【讨论】:

    • @Digital Precision 我是在修改,不是删除约束,另一个表对复合索引的另一部分有约束,所以最后我没有遗漏“复合索引”的要求,我当我制作复合索引时没有注意到.. tks 反正
    猜你喜欢
    • 2014-09-07
    • 2012-01-18
    • 2018-09-21
    • 1970-01-01
    • 2020-01-05
    • 2016-11-19
    • 2016-12-27
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多