网站首页 > 技术文章 正文
SQL SERVER 里面的主外键主要起到约束作用!
主键(Primary Key)
- 是什么:
主键是表中唯一标识每一行数据的列(或列组合)。例如,身份证号、学号等唯一且不重复的值。 - 核心特性:
- 唯一性:主键的值不能重复。
- 非空性:主键的值不能为 NULL。
- 唯一约束:一个表只能有一个主键(但可以由多个列组成)。
- 作用:
确保数据唯一性,并作为其他表引用当前表的“锚点”。 - 示例:
- CREATE TABLE Students ( StudentID INT PRIMARY KEY, -- 主键列 Name VARCHAR(50) );
- 或显式命名主键约束:
- CREATE TABLE Students ( StudentID INT, Name VARCHAR(50), CONSTRAINT PK_Students PRIMARY KEY (StudentID) );
外键(Foreign Key)
- 是什么:
外键是表中指向另一个表主键的列。例如,订单表中的“客户ID”可以指向客户表的主键。 - 核心特性:
- 引用完整性:外键的值必须在另一个表的主键中存在(或为 NULL)。
- 非强制唯一:外键的值可以重复(如一个客户可以有多个订单)。
- 作用:
建立表之间的关系,确保数据一致性(如防止插入无效的客户ID到订单表)。 - 示例:
- CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT FOREIGN KEY REFERENCES Customers(CustomerID) -- 外键 );
- 或显式命名外键约束:
主键 vs 外键对比
特性 | 主键 | 外键 |
唯一性 | 值必须唯一且非空 | 值可以重复,允许 NULL(可选) |
数量限制 | 一个表只能有一个主键 | 一个表可以有多个外键 |
作用目标 | 标识本表数据 | 指向其他表的主键 |
自动创建索引 | 默认创建聚集索引(可修改) | 不自动创建索引(需手动优化) |
实际场景示例
- 主键:
- 学生表 Students 用 StudentID 作为主键,确保每个学生唯一。
- 外键:
- 成绩表 Scores 中的 StudentID 是外键,指向 Students 表的主键。
- 插入成绩时,若 StudentID 不存在于学生表中,操作会被拒绝。
级联操作(可选)
外键可以定义级联行为,自动处理主表数据的变更:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
CONSTRAINT FK_Orders_Customers
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
ON DELETE CASCADE -- 主表数据删除时,自动删除子表关联数据
ON UPDATE SET NULL -- 主表数据更新时,子表外键设为 NULL
);
总结
- 主键:身份证,唯一标识自己。
- 外键:借书卡,通过它关联到图书馆的书籍记录。
- 二者共同维护数据的准确性和关联性。
- 上一篇: 什么是数据库的索引?
- 下一篇: 自增主键去哪了?---一次开发过程中的思考
猜你喜欢
- 2025-07-23 MySql:索引的基本使用(mysql中索引)
- 2025-07-23 阿里二面差点败在这道题:MySQL自增主键为何不是连续的呢?
- 2025-07-23 浅聊MySQL索引分类(mysql索引的几种类型)
- 2025-07-23 智能排产新标杆:注塑车间全自动排程表设计升级-2
- 2025-07-23 如何选择数据库,生活中还有比SQL更重要的东西
- 2025-07-23 access利用DAO设置数据表的主键(access数据库中如何设置主键)
- 2025-07-23 详解MySQL数据库设计之innodb如何设计主键索引
- 2025-07-23 保障数据完整性:深入解析Oracle数据库的主键和外键约束
- 2025-07-23 P7领导建议:可以用UUIDv7作为数据库主键
- 2025-07-23 同样都是做手机 Home 键,为何它们三个差距会那么大?
- 1519℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 606℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 522℃MySQL service启动脚本浅析(r12笔记第59天)
- 490℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 457℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)