SQL中的内连接需要外键吗?

时间:2016-12-01 03:09:07

标签: sql foreign-keys inner-join

INSERT INTO customers (ID, NAME, AGE, ADDRESS, SALARY)
VALUES(3, 'sin', 21, 'bangalore', 10000);

INSERT INTO orders (orderid, orderno)
VALUES (3, 21);

此处IDcustomer表中的主键,orderidorders表中的主键。

我想知道是否必须在id表中添加orders作为外键来执行SQL连接?

2 个答案:

答案 0 :(得分:0)

没有必要建立外键以执行客户和订单表的内部联接。然而,问题在于没有外键这种连接操作的重要性。

据推测,目标是模拟客户与订单之间的某种关系。假设列出的属性包含两个表中的所有属性,则无法按照定义表的方式在客户和订单之间建立关系。在orders表中添加customerID字段作为外键将建立该关系。然后,条件为customers.ID = orders.customerID的内部联接会将订单信息与已连接表中的相应客户信息相关联。

答案 1 :(得分:0)

我在这里的想法是,当您询问是否需要FK时,默认情况下您会接受两者都在同一个域中工作,简而言之,这不是有效的假设

  

内部联接用于读取(查询)数据,而 FK   可以在其他类型的操作(例如插入,更新和删除)中维护数据的完整性。


我认为正确的答案应该是 FK和内部联接都不相关

我将使用下表解释两者之间的区别

Customers 
| id          | name     | 
|:------------|---------:|
| 1           |  Gabriel |
| 2           |  John    | 
| 3           |  Smith   | 


Orders 
| order_id   |customer_id| 
|:-----------|---------: |
| 1          |  1        |
| 2          |  1        | 
| 3          |  1        | 
| 4          |  2        | 

内部加入

例如,根据以上所述,在查询期间使用

,假设您要查询特定客户的所有订单。

select * from customers, orders
where customer.id=orders.customer_id
and customer.id=2

根据我们的表格,您最终将为客户(John)得到一个订单号(4)

外键

在查询期间使用内部联接时,外键用于对主要DML操作(插入,更新和删除)应用策略。

下面是无法违反FK约束的操作示例

Insert into orders(order_id,customer_id) values(5,7)

此操作将失败,因为“客户”表中不存在ID为(7)的客户,更新操作将同样适用。

如果FK启用了删除级联更新级联 这将在尝试删除或更新主表时删除或更新子行,例如删除客户Gabriel的示例将删除订单1,2和3。