回答編集履歴
4
追記
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
推敲
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
推敲
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
追記
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
|
+
```
|