数据库外键约束
作用:
数据库外键约束(FOREIGN KEY Constraint) 的作用主要在于两方面:确保数据的引用完整性(Referential Integrity) 和保持数据的一致性(Consistency)。
确保数据引用的完整性:
外键约束确保在一个表(称为子表)中的数据值必须在另一个表(称为父表)的指定列中有对应的值。这创建了两个表之间的一个引用,这意味着子表的记录引用了父表中的一个合法、存在的记录。如果外键约束被违反,例如,子表中尝试插入一个不在父表中的值,数据库将会拒绝这次插入操作。
保持数据的一致性:
外键还可以定义特定的规则来描述当父表中的数据发生变化时(如记录的更新或删除),应如何处理引用了这些数据的子表中的记录。这帮助数据库维护数据删除或更新的一致性。
举例说明:
假设我们有两个表,Customers
和 Orders
。Customers
表中存储客户信息,而 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
表中的一个客户,例如客户 Alice
(CustomerID
为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
操作可以用于在主表中更新记录时,同时更新对应的子表记录,或在主表中更改记录时在子表中删除相关记录。但是,当使用这些选项时,开发人员应特别注意保证数据的完整性和一致性。