mysql alter int столбец в bigint с внешними ключами - PullRequest
12 голосов
/ 26 января 2012

Я хочу изменить тип данных некоторых столбцов первичного ключа в моей базе данных с INT на 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`);

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

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)

ПОКАЗАТЬ 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")

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

Ответы [ 3 ]

7 голосов
/ 26 января 2012

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

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

3 голосов
/ 26 января 2012

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

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

0 голосов
/ 11 июля 2014

У меня была похожая проблема, решение - предложение об изменении:

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

Это сработало для меня.

...