SQL 外键(Foreign Key)详细讲解

06-01 1842阅读
1. 什么是外键?​​
  • ​​定义​​:外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​。外键的值必须匹配另一个表的主键(Primary Key)或唯一约束(Unique Constraint)的值。
  • ​​作用​​:
    • 确保数据的​​引用完整性​​(Referential Integrity),防止无效数据插入。
    • 维护表之间的逻辑关系(如“一对多”或“多对多”)。
      ​​2. 外键的语法​​

      在创建表时定义外键:

      CREATE TABLE 子表 (
          列1 数据类型,
          列2 数据类型,
          ...
          FOREIGN KEY (外键列) REFERENCES 父表(主键列)
          [ON DELETE 约束行为] [ON UPDATE 约束行为]
      );

      在已有表中添加外键:

      ALTER TABLE 子表
      ADD CONSTRAINT 约束名称
      FOREIGN KEY (外键列) REFERENCES 父表(主键列)
      [ON DELETE 约束行为] [ON UPDATE 约束行为];

      ​​3. 外键的约束行为​​

      当父表的记录被删除或更新时,子表的外键如何处理?通过 ON DELETE 和 ON UPDATE 指定:

      约束行为说明
      ​​CASCADE​​级联操作。父表删除/更新记录时,子表关联记录也被删除/更新。
      ​​SET NULL​​父表删除/更新记录时,子表的外键列设为 NULL(要求外键列允许 NULL)。
      ​​NO ACTION​​默认行为。阻止父表的删除/更新操作,如果子表存在关联记录。
      ​​RESTRICT​​类似 NO ACTION,立即检查约束。
      ​​SET DEFAULT​​父表删除/更新记录时,子表的外键设为默认值(需定义默认值)。

      ​​4. 多列外键​​

      外键可以由多个列组成,需满足:

      • 子表和父表的列数、顺序、数据类型一致。
      • 父表的列必须有唯一约束(如主键或唯一索引)。

        ​​示例​​:

        CREATE TABLE 订单详情 (
            订单ID INT,
            产品ID INT,
            数量 INT,
            PRIMARY KEY (订单ID, 产品ID),
            FOREIGN KEY (订单ID) REFERENCES 订单(订单ID),
            FOREIGN KEY (产品ID) REFERENCES 产品(产品ID)
        );

        ​​5. 外键的限制与注意事项​​
        1. ​​父表必须有主键或唯一约束​​。
        2. ​​外键列的数据类型必须与父表主键一致​​。
        3. ​​引擎支持​​:如 MySQL 的 InnoDB 支持外键,而 MyISAM 不支持。
        4. ​​性能影响​​:外键会增加数据操作的检查开销,但能提升数据一致性。
        5. ​​循环依赖​​:避免两个表互相引用。

        ​​6. 实际应用示例​​

        ​​场景​​:学生表(students)和课程表(courses),通过选课表(enrollments)关联。

        -- 父表:学生表
        CREATE TABLE students (
            student_id INT PRIMARY KEY,
            name VARCHAR(50)
        );
        -- 父表:课程表
        CREATE TABLE courses (
            course_id INT PRIMARY KEY,
            course_name VARCHAR(50)
        );
        -- 子表:选课表(含外键)
        CREATE TABLE enrollments (
            student_id INT,
            course_id INT,
            enrollment_date DATE,
            FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,
            FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE RESTRICT
        );

        ​​插入数据​​:

        -- 插入学生和课程
        INSERT INTO students VALUES (1, 'Alice');
        INSERT INTO courses VALUES (101, 'Math');
        -- 合法插入:学生和课程存在
        INSERT INTO enrollments VALUES (1, 101, '2023-10-01');
        -- 非法插入:学生不存在,触发外键错误
        INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 报错!

        ​​7. 常见问题​​
        1. ​​外键必须指向主键吗?​​

          不,可以指向父表的唯一约束(Unique Constraint)。

        2. ​​能否跨数据库引用?​​

          通常不支持,外键需在同一数据库内。

        3. ​​外键是否允许 NULL?​​

          如果外键列允许 NULL,则插入 NULL 是合法的(表示无关联)。

        4. ​​如何查看外键约束?​​

          使用数据库工具或查询元数据(如 MySQL 的 SHOW CREATE TABLE)。

          SQL 外键(Foreign Key)详细讲解
          (图片来源网络,侵删)

        ​​8. 总结​​
        • ​​外键的核心作用​​:维护数据的一致性和关联性。
        • ​​适用场景​​:需要强数据完整性的系统(如电商、金融)。
        • ​​慎用场景​​:高并发写入且对性能要求极高的系统(需权衡一致性与性能)。
        SQL 外键(Foreign Key)详细讲解
        (图片来源网络,侵删)
        SQL 外键(Foreign Key)详细讲解
        (图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码