前提
WordPressでCREATE TABLE
しています。
外部キーの設定にあたって、CONSTRAINT
を介すとインデックスが自動で貼られ、介さないと貼られないという現象を見つけました。
これにつきまして以下の点を知りたいと思っています。
###知りたいこと
【1】
なぜCONSTRAINT
を介さないとインデックスが貼られないのでしょうか?
MySQLでは外部キーを設定すると自動でインデックスが貼られる機能があるはずですが、以下のCREATE
文の
FOREIGN KEY (first_ID) REFERENCES wp_firsts(ID),
という行での外部キー設定ではいかにしてその機能を逃れ、インデックスが貼られずに済んでいるのでしょうか?
MariaDBだから自動で貼られないのでしょうか?しかしCONSTRAINT
を介した
CONSTRAINT fk_wp_seconds_01 FOREIGN KEY (first_ID) REFERENCES wp_firsts(ID)
という行では自動で貼られていますし、謎です。
【2】
使い道のないインデックスは貼りたくないのですが、外部キーには名前をつけたいです。しかしCONSTRAINT
を介さないと名前をつけることはできないと思うのですが、介せばインデックスが自動で貼られてしまいます。このジレンマを解消し、外部キーに名前をつけつつ、インデックスを貼らない方法はあるでしょうか?
【3】
WordPerssユーザーのみなさんは、どのように外部キーをセットしていますか?
以上の3つですが、どれか1つでも幸いです。
ご回答宜しくお願い申し上げます。
###発生している問題
該当のソースコードを実行しますと、wp_seconds
テーブルに作成されるインデックスは下図の3つとなります。
CONSTRAINT
を介して作成された外部キー(fk_wp_seconds_01
)はインデックスが貼られ、介さない方の外部キーでは貼られないのです。
該当のソースコード
wp_firsts
テーブルと、そのID
カラムを外部キーに持つwp_seconds
テーブルのCREATE
文になります。
PHP
1create_wp_firsts(); 2create_wp_seconds(); 3 4function create_wp_firsts() { 5 global $wpdb; 6 $sql = "CREATE TABLE IF NOT EXISTS wp_firsts ( 7 8 -- カラムを設定 9 ID BIGINT(20) UNSIGNED NOT NULL, 10 title VARCHAR(10) NOT NULL, 11 12 -- 主キーを設定 13 PRIMARY KEY (ID) 14 15 );"; 16 add_option($table."_version", '1.0'); 17 $wpdb->query($sql); 18} 19 20function create_wp_seconds() { 21 global $wpdb; 22 $sql = "CREATE TABLE IF NOT EXISTS wp_seconds ( 23 24 -- カラムを設定 25 ID BIGINT(20) UNSIGNED NOT NULL, 26 first_ID BIGINT(20) UNSIGNED NOT NULL , 27 sentence VARCHAR(100) NOT NULL, 28 29 -- 主キーを設定 30 PRIMARY KEY (ID), 31 32 -- インデックスを設定 33 INDEX idx_wp_seconds_01(sentence), 34 35 -- 外部キーを設定 36 FOREIGN KEY (first_ID) REFERENCES wp_firsts(ID), 37 CONSTRAINT fk_wp_seconds_01 FOREIGN KEY (first_ID) REFERENCES wp_firsts(ID) 38 39 );"; 40 add_option($table."_version", '1.0'); 41 $wpdb->query($sql); 42}
試したこと
wp_seconds
テーブルに対しSHOW CREATE TABLE
を実行すると以下の出力を得ましたが、さらに訳の分からないことになりました。
SQL
1CREATE TABLE `wp_seconds` ( 2 `ID` bigint(20) unsigned NOT NULL, 3 `first_ID` bigint(20) unsigned NOT NULL, 4 `sentence` varchar(100) NOT NULL, 5 PRIMARY KEY (`ID`), 6 KEY `idx_wp_seconds_01` (`sentence`), 7 KEY `fk_wp_seconds_01` (`first_ID`), 8 CONSTRAINT `fk_wp_seconds_01` FOREIGN KEY (`first_ID`) REFERENCES `wp_firsts` (`ID`), 9 CONSTRAINT `wp_seconds_ibfk_1` FOREIGN KEY (`first_ID`) REFERENCES `wp_firsts` (`ID`) 10) ENGINE=InnoDB DEFAULT CHARSET=utf8
この結果によれば、外部キーの設定はいずれもCONSTRAINT
を介してされているのです。
ならばなぜ、fk_wp_seconds_01
だけインデックスが貼られ、wp_seconds_ibfk_1
は貼られないのか…訳がわからなくなてきました。
補足情報(FW/ツールのバージョンなど)
サーバーはGMOサーバーです。
データベースはMariaDBの10.1.11です。
PHPは7.2です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/24 02:21
2020/06/26 22:43
2020/06/27 03:01