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?
Podejście, o którym wspomniałeś, nie jest naiwne, naprawdę możesz z niego korzystać. – Devart
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