###疑問点
以下はツイッターと同じ仕組みを想定し、parent_tweet_idは返信先のtweet_idを示すカラムになります。
以下でエラーにならないのが疑問です。
###疑問が生じた考え
以下には外部キー制約として
SQL
1FOREIGN KEY (`parent_tweet_id`) REFERENCES tweets(`tweet_id`)
とありますがこれは
tweetsテーブルを探して、parent_tweet_idと同じ値がtweetsテーブルのtweet_idになければいけません
という意味の制約だと理解しています。
しかしもしこの理解があっている場合、parent_tweet_idとしてINSERTされている999は、tweetsテーブルのtweet_idに存在しないのに、なぜエラーにならないのでしょうか?
またこのように、外部キー制約を内部のテーブルに使う場合、どのように書くのが一般的な処理方法なのでしょうか?
SQL
1CREATE TABLE tweets( 2 `tweet_id` int not null, 3 `user_id` int not null, 4 `parent_tweet_id` int, 5 `content` varchar(1000) not null, 6 INDEX idx_parent_tweet_id(parent_tweet_id), 7 PRIMARY KEY (`tweet_id`), 8 FOREIGN KEY (`parent_tweet_id`) REFERENCES tweets(`tweet_id`) 9); 10INSERT INTO tweets 11 (`tweet_id`, `user_id`, `parent_tweet_id`, `content`) 12VALUES 13 (1, 1, 0, '元気ですか?'), 14 (2, 2, 999, '元気です') #999は存在しないのにエラーにならない? 15;
###考えた処理方法
一般的な処理方法がわからず自分なりに思いついたのは…とても冗長に思えるのですが次の構造です。
つまり返信関係を示すためだけにparent_relationsというテーブルを別に用意するということですが、これはおかしいでしょうか?
SQL
1CREATE TABLE tweets( 2 `tweet_id` int not null, 3 `user_id` int not null, 4 `content` varchar(1000) not null, 5 PRIMARY KEY (`tweet_id`) 6); 7INSERT INTO tweets 8 (`tweet_id`, `user_id`, `content`) 9VALUES 10 (1, 1, '元気ですか?'), 11 (2, 2, '元気です') 12; 13 14CREATE TABLE parent_relations( 15 `parent_tweet_id` int not null, 16 `tweet_id` int not null, 17 PRIMARY KEY (`parent_tweet_id`), 18 FOREIGN KEY (`parent_tweet_id`) REFERENCES tweets(`tweet_id`), 19 FOREIGN KEY (`tweet_id`) REFERENCES tweets(`tweet_id`) 20); 21INSERT INTO parent_relations 22 (`parent_tweet_id`, `tweet_id`) 23VALUES 24 (999, 2) 25;
回答1件
あなたの回答
tips
プレビュー