web-dev-qa-db-ja.com

MySQLで外部キーを含む列を削除する

次の2つのテーブルがあります。

CREATE TABLE `personal_info` (
 `p_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` text NOT NULL,
 `initials` text NOT NULL,
 `surname` text NOT NULL,
 `home_lang` int(11) NOT NULL,
 PRIMARY KEY (`p_id`),
 KEY `home_lang` (`home_lang`),
 CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=latin1

CREATE TABLE `language_list` (
 `ll_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` text NOT NULL,
 PRIMARY KEY (`ll_id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=latin1

次のようにしてテーブルから列を削除しようとしています:

ALTER TABLE `personal_info` DROP `home_lang`

しかし、私はこのエラーを受け取ったのでそれを行うことはできません:

#1025 - Error on rename of '.\MyDB\#sql-112c_82' to '.\MyDB\personal_info' (errno: 150)

私は最初にインデックスを削除し、次にこれで列を削除しようとしました:

ALTER TABLE personal_info DROP INDEX home_lang

しかし、次のエラーが発生します。

#1553 - Cannot drop index 'home_lang': needed in a foreign key constraint 

だから私は外部キーを削除しようとしました:

ALTER TABLE personal_info DROP FOREIGN KEY home_lang

しかし、このエラーを受け取りました:

#1025 - Error on rename of '.\MyDB\personal_info' to '.\MyDB\#sql2-112c-8d' (errno: 152)

また、最初にすべての値をnullに設定しようとしました:

update personal_info set home_lang = null

しかし、その後、このエラーを受け取りました:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`MyDB`.`personal_info`, CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`))

そして今、私は行き詰まっています。いくつか試しましたが、列を削除できません。列を削除する以外の方法でDBを変更することはできません。

11
Eduan Bekker

DROP FOREIGN KEY構文で間違ったキー名が使用されています。 home_langフィールドに "プレーン"インデックスをドロップしようとしています。それは外部キー自体ではありません。

CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`)
            ^^^^^^^^^^^^^^^^^^^^^--- THIS is the name of the foreign key

試してください:

ALTER TABLE personal_info DROP FOREIGN KEY `personal_info_ibfk_1`
25
Marc B

以下のクエリを使用して、外部キーの名前を見つけます。

SHOW CREATE TABLE forms_main;

次に、キーを取得したら、drop foreign keyコマンドを実行します

alter TABLE `forms_main`
drop FOREIGN key `forms_main_ibfk_1`;

次に、列の削除コマンドを実行します

ALTER TABLE `forms_main` DROP `company_id`;
1
Akshay Naik

他の机 db_name.table_name DROP FOREIGN KEY foreign_key; ALTER TABLE test.exam DROP INDEX id;

0
Hithaisri M K