数据库外键约束的作用以及使用

数据库外键约束

作用:

数据库外键约束(FOREIGN KEY Constraint) 的作用主要在于两方面:确保数据的引用完整性(Referential Integrity) 和保持数据的一致性(Consistency)。

确保数据引用的完整性:

外键约束确保在一个表(称为子表)中的数据值必须在另一个表(称为父表)的指定列中有对应的值。这创建了两个表之间的一个引用,这意味着子表的记录引用了父表中的一个合法、存在的记录。如果外键约束被违反,例如,子表中尝试插入一个不在父表中的值,数据库将会拒绝这次插入操作。

保持数据的一致性

外键还可以定义特定的规则来描述当父表中的数据发生变化时(如记录的更新或删除),应如何处理引用了这些数据的子表中的记录。这帮助数据库维护数据删除或更新的一致性。

举例说明:

假设我们有两个表,Customers 和 OrdersCustomers 表中存储客户信息,而 Orders 表存储这些客户的订单信息。

Customers 表:

+-------------+-----------+
| CustomerID  | Name      |
+-------------+-----------+
| 1           | Alice     |
| 2           | Bob       |
| 3           | Charlie   |
+-------------+-----------+

这里的 CustomerID 是 Customers 表的主键。

Orders 表:

+---------+------------+----------------+
| OrderID | CustomerID | OrderDetails   |
+---------+------------+----------------+
| 100     | 1          | 10 Widgets     |
| 101     | 2          | 5 Gadgets      |
+---------+------------+----------------+

在这里,OrderID 是 Orders 表的主键,而 CustomerID 应指向 Customers 表的对应记录。

如果我们在 Orders 表中设置了一个外键,如下所示:

CONSTRAINT fk_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES Customers(CustomerID) ON DELETE CASCADE ON UPDATE NO ACTION

该外键约束 fk_CustomerOrder 保证了 Orders 表中的 CustomerID 必须在 Customers 表中存在。也就是说,我们不能为不存在的客户创建订单。

如果我们尝试添加一个新订单,其 CustomerID 是4(假设Customers表中没有 CustomerID 为4的记录):

INSERT INTO Orders (OrderID, CustomerID, OrderDetails)
VALUES (102, 4, '7 Widgets');

这条插入语句将会因为外键约束而失败,因为 Customers 表中不存在 CustomerID 为4的客户。

同时,由于 ON DELETE CASCADE 规则的存在,如果我们删除 Customers 表中的一个客户,例如客户 AliceCustomerID 为1):

DELETE FROM Customers WHERE CustomerID = 1;

那么,所有在 Orders 表中其 CustomerID 为1的订单也会被自动删除。这保持了数据库中的数据一致性,防止了孤儿记录的生成(即没有对应父记录的子记录)。

ON DELETE SET NULL:

当父表被删除时,子表中与他关联的记录customerID那一列,救会被设置为NULL.

ON DELETE SET DEFAULT:

当父表中的记录的主键值被更新时,所有引用该记录的子表记录的外键值也将被相应地更新。

ON UPDATE SET NULL:

当父表中的记录的主键值被更新时,所有引用该记录的子表记录的外键值将被设置为 NULL。

ON UPDATE SET DEFAULT:

当父表中的记录的主键值被更新时,所有引用该记录的子表记录的外键值将被设置为默认值。

ON UPDATE CASCADE:

当父表中的记录的主键值被更新时,所有引用该记录的子表记录的外键值也将被相应地更新。

总结:

这些选项中,ON DELETE SET NULL 和 ON DELETE SET DEFAULT 可以在某些情况下很有用,例如,当父表中的记录未被完全删除,但需要移动到其他表时,可以使用 ON DELETE SET NULL。对于那些不能被删除的父表记录,ON DELETE SET DEFAULT 可以用于保证其完整性。

ON UPDATE CASCADE 和 ON UPDATE SET NULL 操作可以用于在主表中更新记录时,同时更新对应的子表记录,或在主表中更改记录时在子表中删除相关记录。但是,当使用这些选项时,开发人员应特别注意保证数据的完整性和一致性。

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值