Número de error de MySQL 150 Crear errores en una clave externa no existente
-
05-07-2019 - |
Pregunta
Estaba luchando con el administrador de mysql intentando cambiar la clave principal en una tabla. No me dejaría así que borro cuatro claves y renombro la tabla, no hay problema.
Ahora he eliminado la tabla original t_order_items pero no puedo cambiar el nombre de t_order_items2 a t_order_items, falla con un error 150.
Así que pensé que crearía la declaración de creación y saldría del administrador en caso de que fuera el problema. La siguiente creación falla pero solo si la tabla se llama t_order_items cualquier otro nombre y tuvo éxito:
DROP TABLE IF EXISTS `web2print`.`t_order_items`;
CREATE TABLE `web2print`.`t_order_items` (
`orderID` bigint(20) NOT NULL,
`productID` bigint(20) NOT NULL,
`itemprice` decimal(10,2) NOT NULL,
`itemvat` decimal(2,2) NOT NULL DEFAULT '0.15',
`quantity` int(10) unsigned NOT NULL,
`description` varchar(100) NOT NULL,
`stockCode` varchar(45) DEFAULT NULL,
`proofpath` varchar(300) DEFAULT NULL,
`consignmentID` bigint(20) unsigned NOT NULL,
`name` varchar(45) NOT NULL,
`order_itemID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`order_itemID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Si compruebo la salida de SHOW ENGINE INNODB STATUS;
Obtengo el siguiente informe FOREIGN KEY ERROR, que es la hora correcta para la inserción, pero hace referencia a las claves externas de la tabla antigua (original) que se eliminó y no existe en este script de creación.
Error en la restricción de clave externa de la tabla web2print / t_order_items: no hay índice en la tabla que contendría las columnas como las primeras columnas, o los tipos de datos en el tabla no coincide con los de la tabla de referencia o una de las columnas ON ... SET NULL se declara NOT NULL. Restricción: , RESTRICCIÓN " FK_t_order_items_1 " LLAVE EXTRAÑA (" orderID ") REFERENCIAS " t_orders " (" orderID ") EN ELIMINAR CASCADE ON UPDATE CASCADE
¿No hay claves foráneas en la mesa? fueron eliminados.
Los siguientes trabajos
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `web2print`.`t_order_items`;
CREATE TABLE `web2print`.`t_order_items` (
`orderID` bigint(20) NOT NULL,
`productID` bigint(20) NOT NULL,
`itemprice` decimal(10,2) NOT NULL,
`itemvat` decimal(2,2) NOT NULL DEFAULT '0.15',
`quantity` int(10) unsigned NOT NULL,
`description` varchar(100) NOT NULL,
`stockCode` varchar(45) DEFAULT NULL,
`proofpath` varchar(300) DEFAULT NULL,
`consignmentID` bigint(20) unsigned NOT NULL,
`name` varchar(45) NOT NULL,
`order_itemID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`order_itemID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
¿Pero por qué tuve que hacer eso?
Gracias por cualquier comentario
Solución
Tuviste restricciones entre t_order_items y t_orders que intentaban validar. Primero tenía que deshabilitarlos antes de abandonar la tabla. Esto es bueno porque te protege a ti y a tus datos. Es posible que se hayan eliminado las claves externas, pero no las restricciones.