2011-10-25 9 views
-2

私はMySQLで2つのテーブルを持っている:SQLデータベーステーブルの関係?

CREATE TABLE names (name_ID INT NOT NULL AUTO_INCREMENT, 
     name VARCHAR(40) NOT NULL, PRIMARY KEY (name_ID)); 

CRETE TABLE surnames (surname_ID INT NOT NULL AUTO_INCREMENT, 
     name_ID INT NOT NULL FOREIGN KEY (name_ID) REFERENCES names (name_ID), 
     surnames VARCHAR(40) NOT NULL, PRIMARY KEY(surname_ID)); 

私の質問、どのような値私は姓の表のFOREIGN KEY列に挿入する必要がありますか?

たとえば、私は、NAMESテーブルにこのデータを入力したとします。

INSERT INTO names VALUES (NULL, 'Pamela'); 
INSERT INTO names VALUES (NULL, 'Sarah'); 

私は姓の表のFOREIGN KEYとして何を使うべきでしょうか?これらの2つのテーブルを関連付けるには、ここで入力する必要があるものは何ですか? surnamesテーブルの外部キーの値のソート方法


これはフォーラムDBからの例です:

CREATE TABLE languages (
lang_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, 
lang VARCHAR(60) NOT NULL, 
lang_eng VARCHAR(20) NOT NULL, 
PRIMARY KEY (lang_id), 
UNIQUE (lang) 
); 

CREATE TABLE threads (
thread_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
lang_id TINYINT(3) UNSIGNED NOT NULL, 
user_id INT UNSIGNED NOT NULL, 
subject VARCHAR(150) NOT NULL, 
PRIMARY KEY (thread_id), 
INDEX (lang_id), 
INDEX (user_id) 
); 

CREATE TABLE posts (
post_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
thread_id INT UNSIGNED NOT NULL, 
user_id INT UNSIGNED NOT NULL, 
message TEXT NOT NULL, 
posted_on DATETIME NOT NULL, 
PRIMARY KEY (post_id), 
INDEX (thread_id), 
INDEX (user_id) 
); 

CREATE TABLE users (
user_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, 
lang_id TINYINT UNSIGNED NOT NULL, 
time_zone VARCHAR(30) NOT NULL, 
username VARCHAR(30) NOT NULL, 
pass CHAR(40) NOT NULL, 
email VARCHAR(60) NOT NULL, 
PRIMARY KEY (user_id), 
UNIQUE (username), 
UNIQUE (email), 
INDEX login (username, pass) 
); 

CREATE TABLE words (
word_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, 
lang_id TINYINT UNSIGNED NOT NULL, 
title VARCHAR(80) NOT NULL, 
intro TINYTEXT NOT NULL, 
home VARCHAR(30) NOT NULL, 
forum_home VARCHAR(40) NOT NULL, 
`language` VARCHAR(40) NOT NULL, 
register VARCHAR(30) NOT NULL, 
login VARCHAR(30) NOT NULL, 
logout VARCHAR(30) NOT NULL, 
new_thread VARCHAR(40) NOT NULL, 
subject VARCHAR(30) NOT NULL, 
body VARCHAR(30) NOT NULL, 
submit VARCHAR(30) NOT NULL, 
posted_on VARCHAR(30) NOT NULL, 
posted_by VARCHAR(30) NOT NULL, 
replies VARCHAR(30) NOT NULL, 
latest_reply VARCHAR(40) NOT NULL, 
post_a_reply VARCHAR(40) NOT NULL, 
PRIMARY KEY (word_id), 
UNIQUE (lang_id) 
); 

挿入外部キーは、私は取得しないとは何ですか?例:

Thread_id、lang_id、外部キーはここにありますか?いいえの場合、手動で挿入されますか?はいの場合は手動で挿入しますか? lol

+0

私はあなたがテーブルSURNAMESで達成しようとしていることを理解できません。より良い説明をしてください。 –

+0

私たちの答えがあなたの必要なものを説明していませんでしたか? – Marco

+0

大多数は分かりませんので、コードを追加したいと思います。私はこれが誰にも読まなくて退屈であることを知っているので、最初は少しのコードで試しました。今私は選択肢がありません – zack

答えて

-1

データを挿入した後に、name_idの値を挿入する必要があります。 name_idフィールドはID列のように見えるので、namesテーブルに行を挿入するたびに、その列には自動的に値が設定されます(1から始まり、追加される行が増えるにつれて増加します)。

つまり、name_id列にNOT NULLと定義しているため、NULLを挿入しようとしないでください。

+0

_ NOTを定義したので、name_id列に 'NULL'を挿入しようとしないでくださいNULL "_:そのフィールドは' AUTO_INCREMENT'ですので、NULLを渡すとエンジンから自動的に新しい値(インクリメンタル)が生成されます!! – Marco

4

私はあなたが必要としていることを理解していると私は確信している私は名前に姓を関連させている理由を理解していない。
とにかくINSERT INTO names VALUES (NULL, 'Pamela')のIDをの名前という名前で作成した場合(最初に挿入されたため)したがって、名前Pamelaに関連する姓を作成する場合は、INSERT INTO surnames (NULL, 1, 'Anderson')を実行する必要があります。
秒と同じです(そのIDはです)INSERT INTO surnames (NULL, 2, 'Gellar')です。

MySQLが姓のテーブルの外部キーの値をどのようにソートするか
何が必要ですか?何でこれが大切ですか?

新しい例の後に編集
スレッドテーブルにはforeighキーが含まれていません。 user_idはおそらくusersテーブルに関連するはずです。なぜなら、lang_idはおそらくlanguageテーブルに対してrealtedされるはずですが、そうではありません。
lang_idフィールドとuser_idフィールドの両方に、WHEREまたはORDER BY条件で使用すると、クエリをより早くするためのインデックスがあります。
クエリを使用するのではなく、データベースの設計中に外部キーを宣言する必要があります。
親テーブルと子テーブルの両方で同じIDを挿入しているフィールドを論理的に関連付けることはできますが、正確に同じではありません。

+1

@zach:私の編集した投稿を見てください – Marco

+0

ありがとう、今私はこれらのテーブルには外部キーがありません – zack

0

私は別のテーブルid | name_id | surname_idを作成し、そこに名前のIDを挿入します。チェックアウトInnoDB

+0

私も 'name' /' surname'テーブル設定に問題があります。これは確かに利用可能なオプションの1つ(おそらく最も単純なもの)です。実際には本当の質問には答えませんが... –