2012-01-26 21 views
12

Chcę zmienić typ danych niektórych kolumn klucza podstawowego w mojej bazie danych z INT na BIGINT. Poniższa definicja jest zabawka przykład do zilustrowania problemu:mysql zmień kolumnę int na bigint z kluczami obcymi

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`); 

Teraz, gdy próbuję EXECUT jedno z poniższych poleceń:

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

biegnę do błędu

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

POKAŻ wyjścia INODB Status:

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") 

Zgaduję, że definicja klucza obcego blokuje zmianę typu kolumny po obu stronach. Naiwne podejście do rozwiązania tego problemu polegałoby na usunięciu definicji kluczy obcych, zmianie kolumn i ponownym zdefiniowaniu kluczy obcych. czy istnieje lepsze rozwiązanie?

+1

Podejście, o którym wspomniałeś, nie jest naiwne, naprawdę możesz z niego korzystać. – Devart

+0

Dzięki Devart! Szukałem mniej bolesnego rozwiązania, ponieważ muszę to zrobić na wielu stołach, ale najwyraźniej upuszczanie i ponowne tworzenie ograniczeń wydaje się być drogą do zrobienia: - /. – deif

Odpowiedz

7

Nawet z SET foreign_key_checks = 0 nie można zmienić typu kolumny więzów. z 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.

Tak, zgadzam się z komentarzem Devart. Po prostu upuść i utwórz ponownie.

+0

próbował także wyłączyć sprawdzanie klucza obcego i nie zadziałało. dzięki za wskazanie przyczyny. – deif

3

mógłbym zasugerować zmianę nazwy tych pól w narzędziu GUI - dbForge Studio for MySQL (free trial edition):

wystarczy wybrać pole, które chcesz zmienić nazwę w Eksploratorze bazy danych kliknij na Refactoring-> polecenie Zmień nazwę, wprowadź nowy w otwartym oknie i naciśnij OK, zmieni nazwę pola i automatycznie odtworzy wszystkie klucze obce.

0

miałem podobny problem Rozwiązaniem jest zmiana klauzuli:

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

który pracował dla mnie.