2012-01-26 25 views
12

私のデータベースのいくつかのプライマリキーカラムのデータ型をINTからBIGINTに変更したいと思います。次の定義は、問題を説明するためにおもちゃ-例です。mysql外部キーでbigintにintカラムを変更する

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) 
に実行していますよ

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

どちらの側でも、外部キー定義のブロックが列の種類を変更していると推測しています。この問題を解決する単純なアプローチは、外部キー定義を削除し、列を変更して外部キーを再定義することです。よりよい解決策がありますか?

+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(無料の試用版を):、ちょうどあなたがデータベースエクスプローラで名前を変更したいフィールドを選択し

Refactoring-をクリック>コマンドの名前を変更し、新しいを入力します。開いているウィンドウに名前を入力し、OKを押すと、フィールドの名前が変更され、すべての外部キーが自動的に再作成されます。

0

私は解決策が変更句で同様の問題があった:

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

私のために働きました。

関連する問題