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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

3回答

8225閲覧

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

yakan

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2020/05/24 02:54

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

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

SQL

1DROP INDEX tags_ID on wp_tag_relations;

↓エラー

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

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

SQL

1ALTER TABLE wp_tag_relations DROP PRIMARY KEY;

↓エラー

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

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

SQL

1ALTER TABLE wp_tag_relations DROP FOREIGN KEY tags_ID;

↓エラー

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

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

SQL

1SHOW 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使用になります。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/05/24 03:56

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

2020/05/24 07:42

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

回答3

0

ベストアンサー

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

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

投稿2020/06/04 02:37

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yakan

2020/06/05 04:39

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

0

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

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

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

投稿2020/06/04 02:33

arcrista_qg

総合スコア70

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yakan

2020/06/05 04:39

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

0

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

追記

具体的にやってみます

SQL

1create table tbl_a (aid int primary key,aval varchar(10)); 2create table tbl_b (bid int primary key ,bval varchar(10),aid int,foreign key fk_b(aid) references tbl_a(aid) on update cascade); 3 4insert into tbl_a values(1,'a1'),(2,'a2'),(3,'a3'); 5insert into tbl_b values(1,'b1',1),(2,'b2',3),(3,'b3',1);

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

SQL

1update tbl_a set aid=100 where aid=1; 2select * from tbl_b;
bidbvalaid
1b1100
2b23
3b3100

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

SQL

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

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

SQL

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

tbl_bは更新されています

  • tbl_b
bidbvalaid
1b1100
2b2100
3b3100

投稿2020/05/24 04:53

編集2020/05/24 08:37
yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yakan

2020/05/24 07:41

>しかし原則ユニークでない外部キー制約はありえないので >考え方がおかしいです 外部キーの参照先はユニークです。以下の部分ですが、wp_tagsテーブルのIDで、このIDは主キーになっています。 CONSTRAINT `wp_tag_relations_ibfk_1` FOREIGN KEY (`tags_ID`) REFERENCES `wp_tags` (`ID`), 今回はwp_tag_relationsのtags_IDがユニークだとおかしいと思った(tags_IDがユニークでは複数掲示板が同じタグを持てなくなる)ので主キーを解除したいわけですが… 逆にこれがユニークでなくなると何がおかしいのかわからないです。教えて頂けませんでしょうか?
yakan

2020/05/24 07:45

>いったん外部キー制約を削除して これを試したつもりなのが「試したこと3」だったのですがエラーでして…
yambejp

2020/05/24 08:40 編集

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

2020/05/25 07:39 編集

>tbl_bの外部キーを削除し、tbl_aのprimay keyを解除したうえで あ、いえ、私が解除したいのは tbl_a の primary keyでなく tbl_b の primary keyですね。 つまり質問でいえば wp_tag_relations の tags_ID の primary key を解除したいのです。
yakan

2020/05/25 19:43 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問