Pergunta

Eu quero alterar o tipo de dados de alguns de chave primária colunas na base de dados de INT para BIGINT.A seguinte definição é um brinquedo-exemplo para ilustrar o problema:

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

Agora quando eu tento sumário um dos seguintes comandos:

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

eu estou correndo em um erro

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

MOSTRAR INODB saídas de 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")

Eu estou supondo que a chave estrangeira de definição de blocos de alterar o tipo de coluna em ambos os lados.O ingênuo abordagem para solucionar este problema seria excluir a chave estrangeira definições, alterar as colunas e re-definir as chaves estrangeiras.existe uma solução melhor?

Foi útil?

Solução

Mesmo com SET foreign_key_checks = 0, você não pode alterar o tipo de restrição de coluna.A partir do 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.

Então, eu concordo com o comentário da Devart.É só soltá-lo e criá-lo novamente.

Outras dicas

Eu poderia sugerir a você para mudar o nome de campos na interface ferramenta - dbForge Studio para o MySQL (edição de avaliação gratuita):

Basta selecionar o campo que você deseja mudar o nome no Banco de dados Explorer, clique em Refatoração->comando Renomear, digite o novo nome no aberto da janela, e pressione OK, mude o nome do campo e recriar todas as chaves estrangeiras automaticamente.

Eu tive um problema semelhante, a solução é a alteração da cláusula:

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

Que trabalhou para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top