2016-04-28 153 views
-1

我瞭解SQL的第一次,而我是從這個網站上沿以下:http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561爲什麼要使用外鍵?

筆者去宣告一個外鍵的麻煩,但我不認爲它曾經做任何事情爲了我們。下面是從頁的例子:

CREATE TABLE customers (
    customer_id INT AUTO_INCREMENT PRIMARY KEY, 
    customer_name VARCHAR(100) 
); 

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY, 
    customer_id INT, 
    amount DOUBLE, 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
); 

INSERT INTO `customers` (`customer_id`, `customer_name`) VALUES 
(1, 'Adam'), 
(2, 'Andy'), 
(3, 'Joe'), 
(4, 'Sandy'); 

INSERT INTO `orders` (`order_id`, `customer_id`, `amount`) VALUES 
(1, 1, 19.99), 
(2, 1, 35.15), 
(3, 3, 17.56), 
(4, 4, 12.34); 

一些表的創建,並在訂單表的CUSTOMER_ID由引用CUSTOMER_ID Customers表。

這裏是混淆了我:文章的作者執行與各種結果下面的語句:

SELECT * FROM customers JOIN orders; 
SELECT * FROM customers NATURAL JOIN orders; 
SELECT * FROM customers JOIN orders WHERE customers.customer_id = orders.customer_id; 

有涉及除其他事項外LEFTRIGHT OUTER JOIN S比語句,但在任何時候做外鍵曾影響過任何事物

我錯過了什麼,或者這些例子太簡單了,不值得使用外鍵?

感謝

回答

0

外鍵定義 - 唉 - 不SELECT語句中使用。這是一個恥辱,因爲NATURAL JOIN應該使用FOREIGN KEY的定義。 「應該」在這裏是道義上的必要條件。 ANSI標準指定它使用具有相同名稱的列,而不是顯式鍵定義。在我看來,沒有理由使用NATURAL JOIN。改爲避免使用USING子句。

它們用於其他情況。值得注意的是,外鍵定義驗證插入到表中或更新的數據具有正確的值。這是非常重要的,也是關係完整性的基礎。

此外,它們允許級聯約束。當主鍵值被更改或刪除時,這些「更新」相關表。

請注意,外鍵定義可以是優化程序使用的提示。您可能看不到效果,但它是可用於性能原因的信息。

0

外鍵都是在聲明中

SELECT * FROM customers JOIN orders WHERE customers.customer_id = orders.customer_id; 

正在使用的WHERE子句中 - 關於customers.customer_id = orders.customer_id的部分恰好是外鍵關係中的應用。

外鍵限制SELECT期間不會導致暗示的外鍵關係。約束的目的是限制(「約束」)插入約束列的數據值。因此,他們僅在INSERTUPDATE的操作中發揮作用。

在這種情況下,具體而言,當在orders.customer_id中插入或更新值時,數據庫首先驗證該值已存在於customers.customer_id列中;如果該值不存在,數據庫將導致語句失敗。