2011-10-25 157 views
-2

我在mysql中的兩個表: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)); 

我的問題是,我需要插入的姓氏表的外鍵列什麼樣的價值觀?

例如,如果我在Names表中輸入驗證數據:

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

我應該作爲姓氏表的外鍵使用?我需要在這裏輸入兩張相關的表格。 MySQL如何在姓氏表中的外鍵中排序值?


這個例子從論壇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) 
); 

插入外鍵是什麼我不明白?例如:

INSERT INTO `threads` (`thread_id`, `lang_id`, `user_id`, `subject`) VALUES 
(1, 4, 1, 'Byttet til PHP 5.0 fra PHP 4.0 - variabler utilgjengelige'), 
(2, 4, 2, 'Automatisk bildekontroll'), 
(3, 3, 5, 'Lancer une Page HTML en PHP'), 
(4, 3, 4, 'Ajouter des adresses a PHP List depuis un formulaire'), 
(5, 9, 4, 'Ovo je dio teksta koji se ubacuje u forum'), 
(7, 1, 1, 'Sample Thread'); 

是THREAD_ID,LANG_ID,這裏外鍵?如果不是,他們手動插入?如果是,他們手動插入?大聲笑

+0

我不明白你想用SURNAMES完成什麼工作。請提供更好的解釋。 –

+0

我們的答案沒有解釋你需要什麼嗎? – Marco

+0

多數人不明白,所以我想添加更多的代碼。我知道這對每個人來說都是無聊的,所以我在開頭就嘗試了很少的代碼。現在我沒有選擇 – zack

回答

-1

插入數據後,您將不得不插入name_id的值。 name_id字段看起來是一個標識列,所以無論何時向names表中插入一行,該列都應自動填充(從1開始,隨着更多行的添加而增加)。

也就是說,您不應該試圖將'NULL'插入name_id列,因爲您已將其定義爲NOT NULL。

+0

_「您不應該試圖將'NULL'插入到name_id列中,因爲您已將其定義爲NOT 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應該可能與用戶表相關,因爲lang_id應該可以實現爲語言表,但它們不是。
我看到的唯一情況是,lang_id和user_id字段都有一個索引,以便在WHEREORDER BY條件中使用它們時查詢更加順暢。
必須在設計數據庫時聲明外鍵,而不是查詢!
你可以「邏輯地」把在parent和child表中插入相同id的字段關聯起來,但它不完全相同。

+1

@zach:看看我編輯過的帖子 – Marco

+0

感謝兄弟,現在我知道這些表沒有外鍵 – zack

0

我會創建另一個表id | name_id | surname_id以及,在那裏插入名稱的ID。退房InnoDB

+0

我也是這樣,有'name' /'surname'表設置問題。這當然是可用選項之一(也可能是最簡單的選項)。雖然它並沒有真正回答真正的問題...... –