2

外部キーもあるテーブルから複数列の一意のキーを削除しようとしています。最初に外部キーを削除しない限り、「errno 150」が発生し続けます。

たとえば、テーブルを作成すると:

CREATE TABLE `testtable` (
    `testtable_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `testtable_value` char(255) DEFAULT NULL,
    `othertable_id` int(10) unsigned NOT NULL,
    PRIMARY KEY (`testtable_id`),
    UNIQUE KEY `tt_unique_key` (`othertable_id`,`testtable_value`),
    CONSTRAINT `tt_foreign_key` FOREIGN KEY (`othertable_id`) REFERENCES `othertable` (`othertable_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

そして、次のように一意のキーを削除しようとします:

ALTER TABLE `testtable` DROP KEY `tt_unique_key`;

次のエラーが生成されます。

Error Code: 1025
Error on rename of './testdb/#sql-374_27' to './testdb/testtable' (errno: 150)

FOREIGN_KEY_CHECKS = 0 を設定しようとしましたが、同じエラーが発生します。

SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE `testtable` DROP KEY `tt_unique_key`;
SET FOREIGN_KEY_CHECKS = 1;

これにより、上記と同じエラー メッセージが生成されます。

ただし、最初に外部キーを削除し、次に一意のキーを削除してから外部キーを再作成すると、すべてが機能します。

ALTER TABLE `testtable` DROP FOREIGN KEY `tt_foreign_key`;
ALTER TABLE `testtable` DROP KEY `tt_unique_key`;
ALTER TABLE `testtable` ADD CONSTRAINT `tt_foreign_key` FOREIGN KEY (`othertable_id`) REFERENCES `othertable` (`othertable_id`);

これは本当に効率が悪いようです。誰が何が起こっているのか説明できますか? 最初に外部キーを削除せずに一意のキーを削除する方法はありますか?

4

1 に答える 1

4

FOREIGN KEY REFERENCES、キーが必要です。
使用できるキーは t_unique_key だけです。そのため、それを削除することはできません。
最初に別の一致するキーを追加してから、古いキーを削除します。あなたの場合は othertable_id フィールド

ALTER TABLE `testtable`
ADD KEY (othertable_id),
DROP KEY `tt_unique_key`;
于 2012-08-08T06:46:10.027 に答える