2012-01-26 13 views
12

Voglio cambiare il tipo di dati di alcune colonne della chiave primaria nel mio database da INT a BIGINT. La seguente definizione è un giocattolo-esempio per illustrare il problema:mysql altera int colonna in bigint con chiavi esterne

CREATE TABLE IF NOT EXISTS `owner` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `thing_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `thing_id` (`thing_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 

DROP TABLE IF EXISTS `thing`; 
CREATE TABLE IF NOT EXISTS `thing` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 

ALTER TABLE `owner` 
    ADD CONSTRAINT `owner_ibfk_1` FOREIGN KEY (`thing_id`) REFERENCES `thing` (`id`); 

Ora quando provo a execut uno dei seguenti comandi:

ALTER TABLE `thing` CHANGE `id` `id` BIGINT NOT NULL AUTO_INCREMENT; 
ALTER TABLE `owner` CHANGE `thing_id` `thing_id` BIGINT NOT NULL; 

sto correndo in un errore

#1025 - Error on rename of './debug/#[temp-name]' to './debug/[tablename]' (errno: 150) 

MOSTRA uscite INODB Stato:

LATEST FOREIGN KEY ERROR 
------------------------ 
120126 13:34:03 Error in foreign key constraint of table debug/owner: 
there is no index in the table which would contain 
the columns as the first columns, or the data types in the 
table do not match the ones in the referenced table 
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint: 
, 
CONSTRAINT "owner_ibfk_1" FOREIGN KEY ("thing_id") REFERENCES "thing" ("id") 

Suppongo che la definizione di chiave esterna blocchi il cambiamento del tipo di colonna su entrambi i lati. L'approccio ingenuo per risolvere questo problema sarebbe quello di eliminare le definizioni di chiavi esterne, modificare le colonne e ridefinire le chiavi esterne. C'è una soluzione migliore?

+1

L'approccio che hai citato non è ingenuo, puoi davvero usarlo. – Devart

+0

Grazie Devart! Stavo cercando una soluzione meno dolorosa poiché devo farlo su molti tavoli, ma a quanto pare cadere e ricreare i vincoli sembra essere la strada da percorrere: - /. – deif

risposta

7

Anche con SET foreign_key_checks = 0, non è possibile modificare il tipo della colonna dei vincoli. da MySQL doc: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

However, even if foreign_key_checks = 0, InnoDB does not permit the creation of a foreign key constraint where a column references a nonmatching column type.

Quindi, sono d'accordo con il commento di Devart. Basta rilasciarlo e crearlo di nuovo.

+0

ha provato a disabilitare anche le chiavi esterne e non ha funzionato. grazie per aver indicato il motivo per cui. – deif

3

potrei suggerire di rinominare tali campi in strumento GUI - dbForge Studio for MySQL (versione di prova gratuita):

selezionare solo il campo che si desidera rinominare nel Database Explorer, cliccare su Refactoring-> comando Rinomina, immettere un nuovo nome nella finestra aperta, e premere OK, rinominerà il campo e ricrea automaticamente tutte le chiavi esterne.

0

Ho avuto un problema simile soluzione è la clausola di cambiamento:

ALTER TABLE table_name CHANGE id id BIGINT(20) NOT NULL AUTO_INCREMENT; 

che ha lavorato per me.