Errore MySQL numero 150 Crea errore su chiave esterna inesistente
-
05-07-2019 - |
Domanda
Stavo lottando con l'amministratore mysql cercando di cambiare la chiave primaria su un tavolo. Non mi permetterebbe quindi di eliminare le chiavi foureign e rinominare la tabella, ottimo problema.
Ora ho eliminato la tabella originale t_order_items ma non riesco a rinominare t_order_items2 in t_order_items, non riesce con un errore 150.
Quindi ho pensato che avrei creato la dichiarazione di creazione e uscito dall'amministratore nel caso fosse il problema. Il seguente stament di creazione ha esito negativo, ma solo se la tabella si chiama t_order_item qualsiasi altro nome e ha esito positivo:
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;
Se controllo l'output di SHOW ENGINE INNODB STATUS;
Ricevo il seguente report ERRORE CHIAVE ESTERO che è l'ora corretta per l'inserimento ma fa riferimento a chiavi esterne della vecchia tabella (originale) che è stata eliminata e non esistono in questo script di creazione.
Errore nel vincolo di chiave esterna della tabella web2print / t_order_items: non esiste un indice nella tabella che contenga le colonne come prime colonne o i tipi di dati in tabella non corrisponde a quelli nella tabella referenziata o una delle colonne ON ... SET NULL è dichiarata NOT NULL. vincolo: , VINCITORE " FK_t_order_items_1 " TASTO ESTERO (" orderID ") RIFERIMENTI " t_order " (" orderID ") IN CANCELLAZIONE DI CASCADE IN AGGIORNAMENTO CASCADE
Non ci sono chiavi esterne sul tavolo? sono stati eliminati.
Le seguenti opere
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;
Ma perché ho dovuto farlo?
Grazie per qualsiasi feedback
Soluzione
Avevi dei vincoli tra t_order_items e t_order che stavano cercando di convalidare. Devi prima disabilitarli prima di abbandonare la tabella. Questo è utile perché protegge te e i tuoi dati. Le chiavi esterne potrebbero essere state eliminate, ma i vincoli no.