2012-01-26 2 views
12

Я хочу изменить тип данных некоторых столбцов первичного ключа в моей базе данных от INT до BIGINT. Следующее определение является игрушка-пример, чтобы проиллюстрировать эту проблему:mysql alter int column to bigint с внешними ключами

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

Теперь, когда я пытаюсь execut одну из следующих команд:

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

я бегу в ошибку

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

SHOW STATUS INODB выходы:

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

Я предполагаю, что определение внешнего ключа блокирует изменение типа столбца с обеих сторон. Наивный подход для решения этой проблемы заключается в удалении определений внешнего ключа, изменении столбцов и переопределении внешних ключей. Есть ли лучшее решение?

+1

Подход, о котором вы упомянули, не является наивным, вы действительно можете его использовать. – Devart

+0

Спасибо Devart! Я искал менее болезненное решение, так как я должен это делать на множестве таблиц, но, видимо, сбрасывание и воссоздание ограничений - это путь: - /. – deif

ответ

7

Даже с SET foreign_key_checks = 0 вы не можете изменить тип столбца ограничения. С MySQL документ: 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.

Итак, я согласен с комментарием Devart. Просто отбросьте его и создайте снова.

+0

также попытался отключить проверку внешнего ключа, и он не работал. спасибо за указание на причину. – deif

3

Я мог бы предложить вам переименовать такие поля в GUI инструмент - dbForge Studio for MySQL (бесплатно пробная версия):

Просто выберите поле, которое вы хотите переименовать в Database Explorer, нажмите на Refactoring-> команду Переименовать, введите новое имя в открывшемся окне и нажмите OK, он переименует поле и автоматически заново закроет все внешние ключи.

0

У меня была аналогичная проблема, решение является условие изменения:

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

, который работал для меня.

Смежные вопросы