若是將某個欄位設為主鍵,則代表不允許兩行資料在該欄位有相同的值,且該欄位可以被用來定位table之中的某一行。
外來鍵的意思是:table上某個欄位的值必須要在另外一個table的主鍵欄位上有出現過,而這樣做的目的是可以將兩個table的資料透過共通的key來進行交叉參考,可以幫助我們做資料的'正規化'
正規化可以降低資料的重複,讓資料變成模組化,更容易管理。
假設我們想要建立一個table紀錄一群學生的考試情形,一般表格的思維會將每個學生所需要的屬性攤開,表格的內容可能會像下面這樣
以上的儲存方式會有一些潛在的問題。目前可以用肉眼看出來,這張table包含了兩位學生的姓名/年級/班級資訊,不過是尚未進行正規化的狀態。每個學生資訊欄位的資料重複地存在表格內,資料庫系統就無從確保他們的一致性。如果學生的資料需要進行更動,就需要將所需要修改的資料一筆一筆更正,過程麻煩,而且資料更新過程中可能出現錯誤。
以下是經過正規化的版本:
查詢的時候可以透過test_record的外來鍵student_id去從student_data table來取得跟第一張圖片一樣的結果。
JOIN在SQL語法裡面代表將兩個table透過兩邊特定欄位共通的值,將兩邊查詢出來的資料行做左右並排的動作。
例如第一章圖片的結果,在經過正規化的資料庫中可以用以下SQL Query取得:
SELECT student_data.student_id, student_data.name AS student_name, student_data.grade, student_data.class, test_record.test_date, test_record.score
FROM test_record join student_data on test_record.student_id = student_data.student_id;
JOIN 又可細分為下列三種:
1.INNER JOIN(或者像上面那樣直接下JOIN而不特別指定時的預設)
只回傳兩邊foreign key相等的部分
2.LEFT || RIGHT (OUTER) JOIN
回傳左||右table的全部內容,然後把另外一邊foreign key相等的地方接上去
3.FULL OUTER JOIN
輸出的結果包含左及右table的全部內容以及foreign key接在一起的部分
4.CROSS JOIN
取卡氏積,意思是輸出兩個table join key欄位的所有組合
例子:
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city) ${ON [DELETE|UPDATE] [CASCADE|SET NULL|RESTICT]},
temp_lo int,
temp_hi int,
prcp real,
date date
);
Foreign key constraint在table上被建立起來之後,如果往設有foreign key constraint的table上面插入資料,而foreign key column的值並不符合參考table內的資料,會出現錯誤訊息。
ON DELETE跟ON UPDATE分別指定當foreign key所參考的table內部如果更新或刪除的處理方式,CASCADE會套用到設定foreign key的table,SET NULL會將設定foreign key的table裡面受影響的row foreign key欄位設為空值,RESTRICT(DEFAULT)則是不允許在被參考的table上面執行會破壞foreign key constraint的操作。