質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

「主キーかつ外部キー」に設定したカラムを、「外部キー」だけにしたい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,345

score 17

実現したいこと

「主キーかつ外部キー」に設定したカラム(tags_ID)を、「外部キー」だけにしたいです。
つまりtags_IDの「主キー」を解除したいのです。

試したこと1

まずこのページの方法ですが下記エラーでした。
https://www.dbonline.jp/mysql/index/index3.html#section2

DROP INDEX tags_ID on wp_tag_relations;

↓エラー

#1091 - 'tags_ID' を削除できません。列/索引の存在を確認して下さい。

試したこと2

続いてこちらですがこれもエラーでした。
https://teratail.com/questions/190888

ALTER TABLE wp_tag_relations DROP PRIMARY KEY;

↓エラー

#1025 - './server1/#sql-d22_4c551a36' の名前を './server1/wp_tag_relations' に変更できません (エラー番号: 150 "Foreign key constraint is incorrectly formed")

試したこと3

外部キー制約のせいで主キーを解除できないのかと思い下記試したのですがこれもエラーでした。

ALTER TABLE wp_tag_relations DROP FOREIGN KEY tags_ID;

↓エラー

#1091 - 'tags_ID' を削除できません。列/索引の存在を確認して下さい。

確認したこと

上のエラーでは「tags_IDの存在を確認して」とあるのでCREATE文を確認しましたが、以下のように普通にtags_IDはありまして、どうにもわかりません。

SHOW CREATE TABLE wp_tag_relations

↓結果

CREATE TABLE `wp_tag_relations` (
 `tags_ID` bigint(20) unsigned NOT NULL,
 `threads_ID` bigint(20) unsigned DEFAULT NULL,
 `comments_ID` bigint(20) unsigned DEFAULT NULL,
 `movies_ID` bigint(20) unsigned DEFAULT NULL,
 PRIMARY KEY (`tags_ID`),
 KEY `idx_wp_tag_relations_01` (`threads_ID`),
 KEY `idx_wp_tag_relations_02` (`comments_ID`),
 KEY `idx_wp_tag_relations_03` (`movies_ID`),
 CONSTRAINT `wp_tag_relations_ibfk_1` FOREIGN KEY (`tags_ID`) REFERENCES `wp_tags` (`ID`),
 CONSTRAINT `wp_tag_relations_ibfk_2` FOREIGN KEY (`threads_ID`) REFERENCES `wp_threads` (`contents_ID`),
 CONSTRAINT `wp_tag_relations_ibfk_3` FOREIGN KEY (`comments_ID`) REFERENCES `wp_comments` (`contents_ID`),
 CONSTRAINT `wp_tag_relations_ibfk_4` FOREIGN KEY (`movies_ID`) REFERENCES `wp_movies` (`links_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


何をどうしたら、tags_IDの「主キー」を解除することができますでしょうか?

環境

WordPress使用になります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/05/24 12:56

    目的はナニでしょう。
    あとWordPressが自動で作るテーブルの定義を勝手に変えるのはあまりよろしくないかと思いますが

    キャンセル

  • yakan

    2020/05/24 16:42

    主キー解除の目的といえば重複を許容したいからですが、なぜそこが気になったのでしょうか?
    ちなみにWordPressが自動で作るテーブルにwp_tag_relationsなど質問のものはどれもありませんのでご安心を。

    キャンセル

回答 3

checkベストアンサー

+1

外部キー制約のせいで主キーを解除できないのかと思い下記試したのですがこれもエラーでした。

DROP FOREIGN KEYに指定するのは制約の名前です。列名ではありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/05 13:39

    どうもありがとうございます。結局テーブルをすべてリセットして対処しておりましたので、おかげ様でこれから楽になります。

    キャンセル

+1

考え方だけの回答になります。すでに試験済みでしたらすみません…。

  1. (あれば)稼働してるシステムを停止します。
  2. 理想のテーブルを別名で新規作成します。
  3. 理想のテーブルに現在のテーブルの情報をコピーします。
  4. 現在のテーブルを削除します。(または別名に変更)
  5. 理想のテーブルの名前を現在のテーブルに変更します。

こんな感じでどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/05 13:39

    ありがとうございます。列名を指定していたのがまずかったみたいでした。

    キャンセル

0

いったん外部キー制約を削除して、プライマリーを削除し
ユニーク設定をしたのち外部キー制約を再設定し、
最後にユニーク設定を削除すればいいでしょう
しかし原則ユニークでない外部キー制約はありえないので
考え方がおかしいです

追記

具体的にやってみます

create table tbl_a (aid int primary key,aval varchar(10));
create table tbl_b (bid int primary key ,bval varchar(10),aid int,foreign key fk_b(aid) references tbl_a(aid) on update cascade);

insert into tbl_a values(1,'a1'),(2,'a2'),(3,'a3');
insert into tbl_b values(1,'b1',1),(2,'b2',3),(3,'b3',1);


ここで、tbl_aにアップデートをかけ、tbl_bを確認します

update tbl_a set aid=100 where aid=1;
select * from tbl_b;
bid bval aid
1 b1 100
2 b2 3
3 b3 100

tbl_bの外部キーを削除し、tbl_aのprimay keyを解除したうえで
tbl_bの外部キーを張りなおします

alter table tbl_b drop foreign key fk_b;
alter table tbl_a drop primary key; 
alter table tbl_a add index aid(aid); 
alter table tbl_b add foreign key fk_b(aid) references tbl_a(aid) on update cascade;


tbl_aのaidはすでにユニークである必要はないのでaid=3を変更して
だぶらせます

update tbl_a set aid=100 where aid=3;
  • tbl_a
aid aval
100 a1
2 a2
100 a3

tbl_bは更新されています

  • tbl_b
bid bval aid
1 b1 100
2 b2 100
3 b3 100

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/24 17:37 編集

    一連の流れを書いておきました
    この後、update tbl_a set aid=200 where aval='a1';
    とかすると外部キー制約がむちゃくちゃになっていることがわかるでしょう
    (ある意味ただしい動きなのですけどね・・・)

    キャンセル

  • 2020/05/24 18:01 編集

    >tbl_bの外部キーを削除し、tbl_aのprimay keyを解除したうえで

    あ、いえ、私が解除したいのは
    tbl_a の primary keyでなく
    tbl_b の primary keyですね。

    つまり質問でいえば
    wp_tag_relations の tags_ID の primary key を解除したいのです。

    キャンセル

  • 2020/05/25 11:38 編集

    ちなみにご回答頂いた一連の流れですが
    alter table tbl_b drop foreign key fk_b;
    でエラーとなり、質問の「試したこと3」と同じ様に外部キーの削除が実行できませんでした。
    http://sqlfiddle.com/#!9/4ba07a

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る