2016-04-28 109 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列中;如果该值不存在,数据库将导致语句失败。