同じ問題に答えを2回登録できなくするために UNIQUE を張ったけれど、
同じ問題のIDを入れることを忘れて張ってしまったことに、データを入れてから気が付いた。
あ、やってしまった。
しかも外部キーも入れてしまっているので処理が大変なテーブルだ。
SQL(作ってしまったテーブル)
CREATE TABLE test (
id INT AUTO_INCREMENT PRIMARY KEY,
test_id INT NOT NULL,
test_text VARCHAR(255) NOT NULL,
UNIQUE (test_id, test_text),
CONSTRAINT fk_test
FOREIGN KEY (test_id)
REFERENCES questions(id)
ON DELETE CASCADE
);その時に UNIQUE を削除したので手順をしたためておきます。
必ずDBのバックアップを取ってから行ってくださいね!
目次
外部キーとUNIQUEインデックスを確認
下記のSQLをPhpMyAdminに叩きます。
SQL
SHOW CREATE TABLE test;
上記のような画面が出てきます。
でも、Create Tableが少ししか表示されないので赤枠で囲った「拡張オプション」をクリックします。

オプションがたくさん出てくるのでデフォルトでは「部分テキスト」になっているので、
これを「全文」に変更し、実行ボタンを押下します。

UNIQUEインデックス = UNIQUE KEY ‘〇〇〇’
外部キー=CONSTRAINT ‘△△△’
なので、上記で言うとUNIQUEインデックスはtest_id、外部キーはfk_testになります。
これを必ずメモしておいてください。
外部キーを削除
外部キーが張られたままUNIQUEインデックスは削除できないので、外部キーを削除します。
SQL
ALTER TABLE test
DROP FOREIGN KEY fk_test;UNIQUEインデックスを削除
お待ちかねのUNIQUEインデックスを削除します。
これで一応重複したデータが入れられます。
SQL
ALTER TABLE test
DROP INDEX test_id;外部キーを再び張る
外部キーが外れたままなので、もう一度張り直します。
SQL
ALTER TABLE test
ADD CONSTRAINT fk_test
FOREIGN KEY (test_id)
REFERENCES questions(id)
ON DELETE CASCADE;おわりに
今回は外部キーを張ったテーブルのUNIQUEインデックスを削除する手順をご紹介しました。
何度も言いますが、必ずDBのバックアップを取ってから実行してください!
もう本当に、外部キー制約は面倒だけれど頑張らねば。
