我有一张表(见下文),其中我将一个复合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_ID
,Empresa_ID
),
KEY IX_SolServicio2
(Empleado_ID
),
KEY IX_SolServicio3
(Empresa_ID
),
KEY FK_SolServicio_TiposServicio
(TipoServ_ID
),
KEY FK_SolServicio_EstatusSolServicios
(EstatusSolServ_ID
),
KEY FK_SolServicio_SolicitudVia
(SolVia_ID
),
KEY 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
)
)ENGINE = InnoDB AUTO_INCREMENT = 7 DEFAULT CHARSET = utf8 COLLATE = utf8_spanish_ci
答案 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`;