小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-05-16 / 28 阅读
0
0

MySQL 设置外键约束 删除外键约束 添加外键约束 外键约束实例

MySQL中的外键约束(FOREIGN KEY)是一种引用完整性约束,用于确保两个表之间的数据一致性,即一个表(从表或子表)中的列(外键)的值必须存在于另一个表(主表或父表)的指定列(主键或其他唯一键)中。外键约束有助于维护数据库中的数据关系,特别是关联数据的一致性和准确性。以下是外键约束的几个关键点和使用方法:

1. 基本概念

  • 主键(PRIMARY KEY):在父表中,它是用于唯一标识每一行记录的列或列组合。
  • 外键(FOREIGN KEY):在从表中,它是一个或多个列,其值必须参照父表中相应列的值。

2. 创建外键

外键可以在创建表时定义,也可以在表创建后通过 ALTER TABLE语句添加。

创建表时定义外键

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

在这个例子中,Orders表中的 CustomerID列是外键,它引用了 Customers表的 CustomerID列。

添加外键到已存在的表

ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

3. 外键约束选项

  • ON DELETE:定义当父表中的相关记录被删除时,从表中的对应记录应如何处理。常见选项有:

    • CASCADE:从表中的相关记录也将被删除。
    • SET NULL:从表中的外键列值被设置为NULL(前提是外键列允许NULL)。
    • SET DEFAULT:将外键列值设置为其默认值(如果设定了默认值)。
    • RESTRICT:默认选项,如果从表中有匹配记录,则不允许删除父表记录。
  • ON UPDATE:定义当父表中的相关记录被更新时,从表中的对应记录应如何响应。选项与 ON DELETE相似。

4. 删除外键

ALTER TABLE Orders
DROP FOREIGN KEY fk_orders_customers;  -- fk_orders_customers 是外键约束的名称

如果不知道外键名称,可以通过 SHOW CREATE TABLE命令查看表结构,从中找到外键名称。

5. 注意事项

  • 在定义外键时,确保父表的引用列已经存在并且设置了适当的约束(如PRIMARY KEY或UNIQUE)。
  • 外键列和参照列的数据类型必须兼容,长度和签名需一致。
  • 在处理大量数据或复杂查询时,外键约束可能会影响性能,尤其是在频繁的插入、更新和删除操作中。
  • 虽然外键可以提高数据的完整性,但在某些高性能应用场景中,可能选择不使用外键约束,而通过应用程序逻辑来维护数据间的一致性。

外键是关系型数据库中实现数据关联和数据一致性的强大工具,正确使用可以显著提升数据的准确性和可靠性。

外键在数据库设计中扮演着至关重要的角色,主要用于维持数据的一致性和完整性,以及表达实体间的关联关系。以下是外键的几个实际用途及例子:

1. 维持数据一致性与完整性

例子1:订单与客户

假设你正在设计一个电商系统的数据库,其中有两个表:一个是 orders(订单表),一个是 customers(客户表)。在 orders表中,每个订单都关联到一个客户。为了确保每笔订单都指向一个真实存在的客户,你可以在 orders表中创建一个外键,引用 customers表的主键(通常是客户ID)。

  • 主表(Parent Table): customers

    • 列:customer_id(主键), name, email, address
  • 从表(Child Table): orders

    • 列:order_id(主键), product, quantity, order_date, customer_id(外键)

这样,如果试图插入一个订单记录,但使用的 customer_idcustomers表中不存在,数据库就会拒绝插入,从而保证了数据的完整性。

2. 实现级联操作

例子2:部门与员工

假设有 departments(部门表)和 employees(员工表)两个表。每个员工属于一个部门,employees表中的 department_id是外键,引用 departments表的 department_id

  • 主表(Parent Table): departments

    • 列:department_id(主键), department_name
  • 从表(Child Table): employees

    • 列:employee_id(主键), name, position, department_id(外键)

当使用 ON DELETE CASCADE选项定义外键时,如果删除一个部门,那么属于该部门的所有员工记录也会自动删除,确保数据的一致性。

3. 支持复杂的查询和数据分析

例子3:课程与学生

在教育系统的数据库设计中,courses(课程表)和 students(学生表)通过一个关联表 course_enrollments(课程报名表)相连,表示学生报名了哪些课程。course_enrollments表中的 student_idcourse_id都是外键,分别引用 studentscourses表的主键。

  • 主表(Parent Table):

    • students: student_id(主键), name, major
    • courses: course_id(主键), course_name, instructor
  • 关联表(Join Table): course_enrollments

    • 列:enrollment_id(主键, 可选), student_id(外键), course_id(外键), enrollment_date

有了这样的设计,你可以轻松查询每个学生的选课情况、每门课程的报名学生名单,或者分析特定专业学生对课程的偏好等,这在统计和报告生成中非常有用。

通过这些例子可以看出,外键不仅帮助维护了数据库中数据的一致性和完整性,还促进了高效的数据管理和分析,是构建复杂数据模型不可或缺的一部分。

外键并不必须是另一个表的主键,但外键所引用的列必须在另一个表中具有唯一性约束。这意味着外键可以引用另一个表的主键,也可以引用具有唯一约束的非主键列。关键在于被引用的列必须能够唯一标识那一行记录,以确保数据的引用完整性。

总结来说:

  • 主键要求在一张表中唯一标识每一行记录,且不能为空。
  • 外键则用来建立两个表之间的关联,它引用另一个表中的一个唯一标识(这通常是一个主键,但也可以是唯一索引的列),允许在从表中外键列的值为空或引用主表中某行的值。

因此,外键并不强制要求是目标表的主键,只要它是唯一即可。

在MySQL中,外键约束(FOREIGN KEY constraint)用于确保主表和从表之间的关系一致性。当创建外键约束时,可以指定 ON DELETEON UPDATE动作,以定义当主表中的行被删除或更新时,从表中受影响的行应如何处理。

关于 ON DELETEON UPDATE选项:

ON DELETE:

  • CASCADE: 当主表中的行被删除时,从表中所有依赖于该行的行也将被自动删除。这可以防止孤儿记录的产生。
  • SET NULL: 当主表中的行被删除时,从表中依赖于该行的外键字段将被设置为NULL(前提是从表的外键字段允许NULL值)。
  • NO ACTION: 默认情况下,如果从表中有依赖的行,则不允许删除主表中的行。这可以防止意外删除导致的关系不一致。
  • RESTRICT: 与 NO ACTION相似,不允许删除主表中的行,如果从表中有依赖的行。这是 NO ACTION的同义词。
  • SET DEFAULT: 将从表中的外键字段设置为其默认值。如果字段有定义默认值的话。

ON UPDATE:

  • CASCADE: 当主表中的行被更新时,从表中所有依赖于该行的外键字段也将被更新为新的主键值。
  • SET NULL: 当主表中的行被更新时,从表中依赖于该行的外键字段将被设置为NULL(如果字段允许NULL值)。
  • NO ACTION: 不允许更新主表中的行,如果从表中有依赖于原主键值的行。
  • RESTRICT: 同 NO ACTION
  • SET DEFAULT: 将从表中的外键字段设置为其默认值。

创建外键约束示例:

假设我们有两个表 authorsbooksauthors表有 author_id作为主键,books表有 book_id作为主键和 author_id作为外键。

CREATE TABLE authors (
    author_id INT PRIMARY KEY,
    author_name VARCHAR(100)
);

CREATE TABLE books (
    book_id INT PRIMARY KEY,
    title VARCHAR(100),
    author_id INT,
    FOREIGN KEY (author_id) REFERENCES authors(author_id)
    ON DELETE CASCADE  -- 当删除authors表中的行时,也删除books表中相应的行
    ON UPDATE CASCADE  -- 当更新authors表中的author_id时,也更新books表中的author_id
);

在这个例子中,如果 authors表中的某行被删除,那么 books表中所有引用该作者ID的行也将被删除,以保持数据一致性。同样,如果 authors表中的 author_id被更新,那么 books表中相应的 author_id也会被更新。

使用 ON DELETEON UPDATE选项时,应根据具体业务逻辑和数据完整性需求来选择合适的动作。

第5章 多表操作.pptx

https://www.alipan.com/s/MTAK5u3RqyY

提取码: 588l

点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。


评论