为什么要打扰外键?

时间:2016-04-28 02:51:59

标签: mysql foreign-keys foreign-key-relationship

我第一次学习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用于引用customers表中的customer_id。

这让我感到困惑:文章的作者执行以下语句并得到了各种结果:

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的语句,但外键在任何时候都不会影响任何内容。

我是否遗漏了某些内容,或者这些示例是否过于简单而无法使用外键?

由于

2 个答案:

答案 0 :(得分:0)

外键定义 - 唉 - 未在SELECT语句中使用。这很遗憾,因为NATURAL JOIN应该使用FOREIGN KEY定义。 "宜"这是道义上的迫切需要。 ANSI标准指定它使用具有相同名称的列,而不是显式键定义。在我看来,没有理由使用NATURAL JOIN。相反,请避免使用USING子句。

它们用于其他情况。值得注意的是,外键定义验证插入表中或在表中更新的数据具有正确的值。这非常重要,也是关系完整性的基础。

此外,它们允许级联约束。这些"更新"更改或删除主键值时的相关表。

请注意,外键定义可以是优化程序使用的提示。您可能看不到效果,但可以出于性能原因使用该信息。

答案 1 :(得分: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中是否已存在该值;如果该值不存在,则数据库将导致该语句失败。