我第一次学习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;
除了其他内容之外,还有更多涉及LEFT
和RIGHT OUTER JOIN
的语句,但外键在任何时候都不会影响任何内容。
我是否遗漏了某些内容,或者这些示例是否过于简单而无法使用外键?
由于
答案 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
期间不会导致隐含的外键关系。约束的目的是限制("约束")插入到约束列中的数据的值。因此,它们仅在INSERT
和UPDATE
操作期间发挥作用。
在这种情况下,具体而言,当在orders.customer_id
中插入或更新值时,数据库首先验证列customers.customer_id
中是否已存在该值;如果该值不存在,则数据库将导致该语句失败。