我有一个表(见下文(,其中我向另一个表添加了一个复合前置键。我无法向此表添加行,因为外键失败,即使父键有包含复合索引值的记录......因此,该表当前为空。
外键真的不需要,系统用一个 Fk 到另一个表 ID 就足够了,所以我尽力删除外键无济于事,总是得到臭名昭著的 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)
有趣的是,创建表将此约束引用为 FK_Servicios_SolServicio
而不是:FK_Servicios_SolServicio2
(末尾缺少 2
这是另一个表
创建表SolServicio
( SolSer_ID
int(10( 无符号 NOT NULL auto_increment, Empresa_ID
int(10( 无符号不为空, FechaSolicitud
日期时间不为空, HoraSolicitud
时间不为空, Solicito
varchar(20( 整理utf8_spanish_ci不为空, 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
( 引用 Empresas
( Empresa_ID
(, 外键SolServicio_ibfk_2
约束 ( SolVia_ID
( 引用 SolicitudVia
( SolVia_ID
(, 约束SolServicio_ibfk_3
外键 ( Empleado_ID
( 引用 Empleados
( Empleado_ID
(, 外键SolServicio_ibfk_4
约束 ( TipoServ_ID
( 引用 TiposServicio
( TipoServ_ID
(, 外键SolServicio_ibfk_5
约束 ( EstatusSolServ_ID
( 引用 EstatusSolServicios
( EstatusSolServ_ID
(( 引擎=InnoDB AUTO_INCREMENT=7 默认字符集=UTF8 COLLATE=utf8_spanish_ci
嗯,对我来说,这看起来像一个错字:您有一个唯一键,其中包含您尝试删除的外键的名称(FK_Servicios_SolServicio2
(。并且您有一个外键,其名称为 FK_Servicios_SolServicio
,您在脚本中用 ** 标记。显然,您无法删除带有DROP FOREIGN KEY
的唯一键。我建议再试一次
ALTER TABLE `Servicios` DROP FOREIGN KEY `FK_Servicios_SolServicio`;
编辑:对不起,没有读到你已经试过这个了
尝试
SET foreign_key_checks = 0;
ALTER TABLE `Servicios` DROP FOREIGN KEY `FK_Servicios_SolServicio2`;
SET foreign_key_checks = 1;