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

回答編集履歴

3

追記

2016/11/08 05:04

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -30,4 +30,46 @@
30
30
  ```
31
31
  で外部キー制約を追加した後、articlesのcategory_idにはarticlecategoriesのidに存在するキーを入れる。
32
32
 
33
- そうしておけばarticlecategoriesからユーザーがフィールドを削除したらそれに対応するarticlesのフィールドも削除されます。
33
+ そうしておけばarticlecategoriesからユーザーがフィールドを削除したらそれに対応するarticlesのフィールドも削除されます。
34
+
35
+
36
+ ### 2016/11/08 13:14と2016/11/08 13:19への回答追記
37
+ 実際にどんなデータが入っているかわかりませんので、あくまでこちらの想像で簡易化して書きますが
38
+ articlecategoris.idがにたとえば今1,2,3,4,5が登録されてるとします。
39
+
40
+ その時
41
+ articlesにcategory_idというカラムを追加するのは
42
+ `alter table articles add category_id int NOT NULL default 0 after user_id; `
43
+ でできるが、その後articlesに対して外部キー制約を付与しようと
44
+ `alter table articles add foreign key (category_id) references articlecategories(id) on update cascade on DELETE CASCADE;`
45
+ を実行するとエラーがでた。
46
+
47
+ これを回避するのは上記にも書きましたが、articles.category_idの値をarticlecategoris.idに存在する値1,2,3,4,5のどれかが入っていいとチェックが入りSQLを成功できない。
48
+
49
+ なので方法として先に1,2,3,4,5の値を入れてから外部キー制約を実行するか、SQL実行時外部キーの整合生のチェックが入らないように
50
+ `SET FOREIGN_KEY_CHECKS=0;`
51
+ で外部キーチェックを無効にしてarticles.category_idを0のまま外部キー制約を付与するの2つを回答しました。
52
+ もちろんその後外部キーチェックをしてもらわないといけないので
53
+ `SET FOREIGN_KEY_CHECKS=1;`
54
+ で戻しておく。
55
+
56
+ そしてここからですが、もしSET FOREIGN_KEY_CHECKS=0の方法で追加した場合、データ的には
57
+ articles.category_idとarticlecategoris.idの整合生がおかしいままなのでarticles.category_idに1,2,3,4,5の中からデータを入れないといけない。
58
+
59
+ ここまでOKですか?
60
+
61
+ もし今後articlesにフィールドを追加する場合もarticles.category_idにはarticlecategoris.idの中に存在する値を指定しないと
62
+ defaultの0は入れる事ができないので、無理です。
63
+
64
+ なのでこの解決方法はarticlesにフィールド追加する際にはarticles.category_idを未指定(defaultの値が使われる)でのinsertは行わない。
65
+ という方法か、
66
+ defaultが0になっているのをdefaultを(確実に存在する値)1などにしてエラーが出ないようにする。
67
+
68
+ > こちら側でarticlecategories.id が1に「カテゴリなし」的な感じにしたフィールドをこちら側で1個挿入しておくべきでしょうか。
69
+
70
+ テーブルの名前からブログのカテゴリーのような感じなのかな?と思いますので、その方法はあだと思います。
71
+ articles.category_idのdefault値を1に変更、articlecategoris.idの1はカテゴリなしというようなフィールドにしておく
72
+ articles.category_idを未指定でinsertした記事はカテゴリーなしとして登録される。
73
+
74
+ という流れになるので良いと思います。
75
+

2

追記

2016/11/08 05:04

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -19,4 +19,15 @@
19
19
  `既存のテーブルにあるフィールド群に値を手動で挿入するためのクエリとはどんな方法があるのでしょうか。`
20
20
  とありますが、しばらく考えましたが、質問の意図がわかりません。
21
21
 
22
- どのカラムに何を入れたいクエリを想定されてますか?
22
+ どのカラムに何を入れたいクエリを想定されてますか?
23
+
24
+ ###追記
25
+
26
+ ```
27
+ SET FOREIGN_KEY_CHECKS=0;
28
+ alter table articles add foreign key (category_id) references articlecategories(id) on update cascade on DELETE CASCADE;
29
+ SET FOREIGN_KEY_CHECKS=1;
30
+ ```
31
+ で外部キー制約を追加した後、articlesのcategory_idにはarticlecategoriesのidに存在するキーを入れる。
32
+
33
+ そうしておけばarticlecategoriesからユーザーがフィールドを削除したらそれに対応するarticlesのフィールドも削除されます。

1

追記

2016/11/07 16:55

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -5,4 +5,18 @@
5
5
  alter table articles add foreign key (category_id) references articlecategories(id) on update cascade on DELETE CASCADE;
6
6
  SET FOREIGN_KEY_CHECKS=1;
7
7
  ```
8
- とりあえず、チェック飛ばして外部キー制約のコマンド通してからデータがちゃんと紐づくように値入れていかれては?
8
+ とりあえず、チェック飛ばして外部キー制約のコマンド通してからデータがちゃんと紐づくように値入れていかれては?
9
+
10
+ ###追記
11
+
12
+ とりあえず、foreign keyのSQLが通るようには回答したつもりですが、よくよく質問文を読むと
13
+
14
+ タイトルが
15
+ `MySQLで追加したカラムに値を挿入したいがdefaultは使いたくない`
16
+
17
+ 質問文に
18
+
19
+ `既存のテーブルにあるフィールド群に値を手動で挿入するためのクエリとはどんな方法があるのでしょうか。`
20
+ とありますが、しばらく考えましたが、質問の意図がわかりません。
21
+
22
+ どのカラムに何を入れたいクエリを想定されてますか?