当前位置: 代码网 > it编程>数据库>MsSqlserver > SQL 外键Foreign Key全解析

SQL 外键Foreign Key全解析

2025年05月14日 MsSqlserver 我要评论
1. 什么是外键?​​ ​​定义​​:外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​。外键的值必须匹配另一个表的主键(primary key)或唯一约束(unique con

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. 外键的限制与注意事项​​ ​

  • 父表必须有主键或唯一约束​​。
  • ​外键列的数据类型必须与父表主键一致​​。
  • ​引擎支持​​:如 mysql 的 innodb 支持外键,而 myisam 不支持。
  • ​性能影响​​:外键会增加数据操作的检查开销,但能提升数据一致性。
  • ​循环依赖​​:避免两个表互相引用。

​​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. 常见问题​​

​外键必须指向主键吗?​
不,可以指向父表的唯一约束(unique constraint)。

​能否跨数据库引用?​
通常不支持,外键需在同一数据库内。

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

​如何查看外键约束?​
使用数据库工具或查询元数据(如 mysql 的 show create table)。

​​8. 总结​​ ​

  • 外键的核心作用​​:维护数据的一致性和关联性。​
  • 适用场景​​:需要强数据完整性的系统(如电商、金融)。​
  • 慎用场景​​:高并发写入且对性能要求极高的系统(需权衡一致性与性能)。

到此这篇关于sql 外键(foreign key)详细讲解的文章就介绍到这了,更多相关sql 外键foreign key内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com