teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2020/06/29 14:29

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -5,6 +5,8 @@
5
5
  追記
6
6
  --
7
7
  質問の内容から、用いられるSQLは以下を想定されているのだと思います。
8
+ A.
9
+ --
8
10
  ```SQL
9
11
  select *
10
12
  from mytable1 t1
@@ -15,6 +17,8 @@
15
17
  ```
16
18
  この場合、外部キー制約により片側一方が設定されない場合の値(例えば0)をmytable2 や3に値として登録しておく必要があります。
17
19
 
20
+ B.
21
+ --
18
22
  テーブル構造を
19
23
  ```SQL
20
24
  CREATE TABLE IF NOT EXISTS mytable1 (
@@ -32,4 +36,22 @@
32
36
  on t1.type=0 and t1.mytable_ID=t2.id
33
37
  left join mytable3 t3
34
38
  on t1.type=1 and t1.mytable_ID=t3.id
35
- ```
39
+ ```
40
+ **A.**の問い合わせに関して適切にインデックスを適用しようとするなら
41
+ `(mytable2_ID)`,`(mytable3_ID)`の2つのインデックスが必要です。
42
+ ※`(mytable2_ID , mytable3_ID)`のインデックスでは効率的ではありません。
43
+ この2つのインデックスを適用する為にはunionを使用する必要があります。
44
+ ```
45
+ select ~
46
+ from mytable1 t1
47
+ inner join mytable2 t2
48
+ on t1.mytable2_ID=t2.id
49
+ union all
50
+ select ~
51
+ from mytable1 t1
52
+ inner join mytable3 t3
53
+ on t1.mytable3_ID=t3.id
54
+ ```
55
+ union ですから、当然select項目は数を合わせなければなりません。
56
+
57
+ 一方、**B.**の問い合わせ関しては、`(type, mytable_ID)`のインデックスを用意するだけです。

3

推敲

2020/06/29 14:29

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,10 +1,7 @@
1
1
  値が与えられなければ、必然的にNUllになるので、敢えて指定する必要は無く、また敢えてDEFAULT Nullにする場面は思いつきません。
2
2
 
3
3
  例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
4
- 値が与えられなければ、必然的にNUllになるので、敢えて指定する必要は無く、また敢えてDEFAULT Nullにする場面は思いつきません。
5
4
 
6
- 例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
7
-
8
5
  追記
9
6
  --
10
7
  質問の内容から、用いられるSQLは以下を想定されているのだと思います。

2

推敲

2020/06/29 09:48

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  追記
9
9
  --
10
- 質問の内容から、用いられるSQLは以下を想定されいるのだと思います。
10
+ 質問の内容から、用いられるSQLは以下を想定されいるのだと思います。
11
11
  ```SQL
12
12
  select *
13
13
  from mytable1 t1

1

追記

2020/06/29 09:46

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,3 +1,38 @@
1
1
  値が与えられなければ、必然的にNUllになるので、敢えて指定する必要は無く、また敢えてDEFAULT Nullにする場面は思いつきません。
2
2
 
3
- 例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
3
+ 例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
4
+ 値が与えられなければ、必然的にNUllになるので、敢えて指定する必要は無く、また敢えてDEFAULT Nullにする場面は思いつきません。
5
+
6
+ 例に挙げているテーブルで、何れか一方がNot Nullでもう一方はNUllという事なら、それは制約で定義するものですし、設計としてなら、値とその識別(A or B)というテーブル設計であるべきでしょう。
7
+
8
+ 追記
9
+ --
10
+ 質問の内容から、用いられるSQLは以下を想定されいるのだと思います。
11
+ ```SQL
12
+ select *
13
+ from mytable1 t1
14
+ left join mytable2 t2
15
+ on t1.mytable2_ID=t2.id
16
+ left join mytable3 t3
17
+ on t1.mytable3_ID=t3.id
18
+ ```
19
+ この場合、外部キー制約により片側一方が設定されない場合の値(例えば0)をmytable2 や3に値として登録しておく必要があります。
20
+
21
+ テーブル構造を
22
+ ```SQL
23
+ CREATE TABLE IF NOT EXISTS mytable1 (
24
+ ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
25
+ type int(1) not null, -- mytable_idの参照先(0:mytable2, 1:mytable3)
26
+ mytable_ID INT(10) not null
27
+ )
28
+ ```
29
+ のようにした場合、外部キーの設定はできませんが、必須が担保されるので、default値は不要になります。
30
+ また、問い合わせは以下の様になります。
31
+ ```SQL
32
+ select *
33
+ from mytable1 t1
34
+ left join mytable2 t2
35
+ on t1.type=0 and t1.mytable_ID=t2.id
36
+ left join mytable3 t3
37
+ on t1.type=1 and t1.mytable_ID=t3.id
38
+ ```