回答編集履歴

1

追記

2018/07/02 23:15

投稿

Orlofsky
Orlofsky

スコア16415

test CHANGED
@@ -5,3 +5,121 @@
5
5
 
6
6
 
7
7
  参照元カラムと参照先カラムの定義が違っていたりしませんか?
8
+
9
+
10
+
11
+ 追記
12
+
13
+
14
+
15
+ 外部キーは親子関係にあるテーブルを指定することで、親に存在しないデータを
16
+
17
+ 子テーブルに入れさせないことでイレギュラーなデータを防ぐ機能です。
18
+
19
+
20
+
21
+ 以下、typoはお許しを
22
+
23
+
24
+
25
+ 準備
26
+
27
+ ```SQL
28
+
29
+ CREATE TABLE `parent_table`
30
+
31
+ (
32
+
33
+ `parent_id` INT NOT NULL,
34
+
35
+ , PRIMARY KEY (`parent_id`)
36
+
37
+ )
38
+
39
+ ENGINE=InnoDB;
40
+
41
+
42
+
43
+ CREATE TABLE `child_table`
44
+
45
+ (
46
+
47
+ `child_id` INT NOT NULL
48
+
49
+ , `parent_id` INT NOT NULL
50
+
51
+ , PRIMARY KEY (`child_id`)
52
+
53
+ , INDEX `idx_parent_id` (`parent_id`)
54
+
55
+ )
56
+
57
+ ENGINE=InnoDB ;
58
+
59
+
60
+
61
+ -- 初期データ
62
+
63
+ INSERT INTO `parent_table`(`parent_id`) VALUES(1) ;
64
+
65
+ INSERT INTO `child_table`(`child_id`, `parent_id`) VALUES(1, 1) ;
66
+
67
+ INSERT INTO `child_table`(`child_id`, `parent_id`) VALUES(2, 3) ; -- 親テーブルに存在しないデータ
68
+
69
+ COMMIT ;
70
+
71
+ ```
72
+
73
+ 外部キーを追加
74
+
75
+ ```SQL
76
+
77
+ ALTER TABLE `child_table`
78
+
79
+ ADD CONSTRAINT `parent_child_parent_id_fk` FOREIGN KEY `parent_id` REFERENCES `parent_table` (`parent_id`)
80
+
81
+ ```
82
+
83
+ と、親テーブルに存在しないデータがあるから、エラーになって外部キーを追加できない。
84
+
85
+
86
+
87
+ 副問合せで親キーが見つからないデータを特定する。
88
+
89
+ ```SQL
90
+
91
+ SELECT CT.`child_id`, CT.`parent_id`
92
+
93
+ FROM `child_table` CT
94
+
95
+ WHERE CT.`parent_id` NOT IN
96
+
97
+ (
98
+
99
+ SELECT PT.`parent_id` FROM parent_table` PT
100
+
101
+ )
102
+
103
+ ```
104
+
105
+ で、親データを追加するか、間違った小データをDELETEする。
106
+
107
+ ```SQL
108
+
109
+ DELETE FROM `child_table` CT
110
+
111
+ WHERE CT.`child_id` = 2 ;
112
+
113
+ COMMIT ;
114
+
115
+ ```
116
+
117
+ 改めて外部キーを追加する。
118
+
119
+ ```SQL
120
+
121
+ ALTER TABLE `child_table`
122
+
123
+ ADD CONSTRAINT `parent_child_parent_id_fk` FOREIGN KEY `parent_id` REFERENCES `parent_table` (`parent_id`)
124
+
125
+ ```