当前位置: 首页 > news >正文

SQL键类型详解:超键到外键全解析

在 SQL 中,键(Key)是数据库设计的核心要素,用于确保数据完整性、建立表间关系和优化查询效率。以下从特性、作用、使用场景、创建方式及示例五个维度,详细解析常见的键类型:

一、超键(Super Key)

特性
  • 由一个或多个列组成的集合,能唯一标识表中的一条记录
  • 允许包含冗余列(即删除部分列后,剩余部分仍可能是超键)。
  • 一个表可以有多个超键,且超键之间可能存在包含关系。
作用
  • 基础标识作用,是候选键、主键的 “前身”(候选键是最小超键)。
使用场景
  • 主要用于数据库设计的理论分析阶段,实际建表时很少直接定义超键(更多使用其简化形式 —— 候选键或主键)。
示例

假设有学生表 students,包含列 学号(id)、姓名(name)、身份证号(id_card)

  • (id) 是超键(可唯一标识学生)。
  • (id, name) 是超键(id 已能唯一标识,name 是冗余列)。
  • (id_card, name) 是超键(id_card 唯一,name 冗余)。

二、候选键(Candidate Key)

特性
  • 最小的超键(删除任何一个列后,就不再能唯一标识记录)。
  • 不包含冗余列,值唯一且非 NULL(与主键要求一致)。
  • 一个表可以有多个候选键(称为 “复合候选键” 时由多列组成)。
作用
  • 作为主键的候选者,提供了表中记录的 “备用唯一标识”。
  • 保证数据唯一性,是设计主键的基础。
使用场景
  • 表中存在多个可唯一标识记录的列时(如 “学生表” 的学号和身份证号)。
  • 为后续主键选择提供灵活的备选方案。
示例

学生表 students 中:

  • 若 id 唯一且非空,则 id 是候选键。
  • 若 id_card 唯一且非空,则 id_card 也是候选键。
  • 此时 id 和 id_card 均为候选键,可从中选择一个作为主键。

三、主键(Primary Key, PK)

特性
  • 从候选键中人为选定的唯一标识,一个表只能有一个主键
  • 主键列不允许为 NULL,且值绝对唯一(无重复)。
  • 通常自动创建索引(主键索引),可大幅提升查询效率。
作用
  • 唯一标识表中的每条记录,避免数据重复。
  • 作为表与表之间关联的 “锚点”(外键通常关联主键)。
  • 通过主键索引加速查询(尤其是按主键过滤或排序时)。
使用场景
  • 所有表都应定义主键(除非特殊情况,如日志表等无唯一标识的表)。
  • 需唯一区分记录的场景(如用户表的user_id、订单表的order_id)。
创建方式
  1. 建表时定义(最常用):

CREATE TABLE users (user_id INT PRIMARY KEY,  -- 单列主键username VARCHAR(50) NOT NULL,email VARCHAR(100)
);

   2.复合主键(多列组合作为主键):

-- 课程学生关联表(一个学生可选多门课,一门课有多个学生)
CREATE TABLE student_course (student_id INT,course_id INT,PRIMARY KEY (student_id, course_id)  -- 复合主键,确保(学生,课程)组合唯一
);

  3.建表后添加主键(需确保列非空且唯一):

CREATE TABLE products (product_id INT,product_name VARCHAR(100)
);
-- 后续添加主键
ALTER TABLE products 
ADD PRIMARY KEY (product_id);

四、外键(Foreign Key, FK)

特性
  • 用于关联两个表的列(或列组合),其值需匹配另一个表的主键或唯一键
  • 所在表称为 “子表”,被关联的表称为 “父表”。
  • 外键值可以为 NULL(表示该记录未关联父表数据),但非 NULL 时必须在父表中存在(除非设置级联操作)。
作用
  • 建立表之间的参照完整性(如 “订单表” 的user_id必须对应 “用户表” 中存在的user_id)。
  • 定义表间关系(一对一、一对多、多对多),是关系型数据库的核心特性。
使用场景
  • 存在关联关系的表(如 “订单表” 与 “用户表”、“学生表” 与 “班级表”)。
  • 需限制子表数据必须依赖父表存在的场景(如不允许存在 “不存在的用户” 的订单)。
创建方式
  1. 建表时定义外键

-- 父表(班级表)
CREATE TABLE classes (class_id INT PRIMARY KEY,class_name VARCHAR(50) NOT NULL
);-- 子表(学生表),外键关联班级表的class_id
CREATE TABLE students (student_id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,class_id INT,  -- 外键列-- 定义外键:引用父表的主键FOREIGN KEY (class_id) REFERENCES classes(class_id)ON DELETE SET NULL  -- 父表记录删除时,子表外键设为NULLON UPDATE CASCADE   -- 父表主键更新时,子表外键同步更新
);
  • ON DELETE/ON UPDATE 是级联操作,可选值:RESTRICT(禁止删除 / 更新,默认)、CASCADE(级联删除 / 更新)、SET NULL(设为 NULL)等。

  2.建表后添加外键

ALTER TABLE students
ADD FOREIGN KEY (class_id) 
REFERENCES classes(class_id);

五、唯一键(Unique Key)

特性
  • 保证列(或列组合)的值唯一,但与主键的区别:
    • 一个表可以有多个唯一键(主键只能有一个)。
    • 唯一键允许列值为NULL(但最多只能有一个 NULL,因 SQL 中 NULL≠NULL)。
  • 会自动创建唯一索引,提升查询效率(类似主键索引)。
作用
  • 约束非主键列的唯一性(如用户表的 “手机号”“邮箱”)。
  • 作为外键的关联目标(主键也可,但唯一键更灵活)。
使用场景
  • 需要唯一但不作为主键的列(如 “用户表” 的phone,需唯一但主键用user_id)。
  • 多列组合唯一的场景(如 “文章表” 的(title, author)组合不重复)。
创建方式
  1. 建表时定义

CREATE TABLE users (user_id INT PRIMARY KEY,email VARCHAR(100) UNIQUE,  -- 唯一键:邮箱不重复phone VARCHAR(20) UNIQUE,   -- 另一个唯一键:手机号不重复username VARCHAR(50)
);

    2.复合唯一键(多列组合唯一):

CREATE TABLE articles (article_id INT PRIMARY KEY,title VARCHAR(200),author_id INT,-- 标题+作者组合唯一(避免同一作者重复发同标题文章)UNIQUE KEY unique_title_author (title, author_id)
);

   3.建表后添加唯一键

ALTER TABLE users
ADD UNIQUE (email);  -- 为email添加唯一键

总结对比表

键类型唯一性允许 NULL数量限制核心作用典型场景
超键允许多个理论上的唯一标识(含冗余)数据库设计分析阶段
候选键不允许多个主键的候选(无冗余)提供唯一标识备选方案
主键不允许1 个表的主标识,关联基础所有表的唯一记录标识
外键允许多个建立表间关联,保证参照完整订单 - 用户、学生 - 班级关联
唯一键允许多个约束非主键列的唯一性邮箱、手机号等唯一但非主键列

http://www.dtcms.com/a/560771.html

相关文章:

  • vue使用d3实现图片的缩放、拖动、添加/删除标记等功能(完整版前端+后端)
  • 纯前端打造个人成长网站:零后端、零部署、零服务器的实践分享
  • Vue解决开发环境 Ajax 跨域问题
  • 网站注册地查询济南网站建设要多少钱
  • 清控人居建设集团网站简历模板word
  • RDPWD!SM_Connect函数中pRealSMHandle->encryptionLevel的由来
  • Spring数据访问基石:JDBC与事务架构总览
  • 【Hadoop】Hadoop 起源与核心组件解析 —— 大数据时代的分布式基石
  • 【printpdf】date.rs 文件详细解析
  • Pycharm详解:高效Python开发的首选IDE
  • 广州市品牌网站建设公司微网站的特点
  • 影刀RPA完全指南:从零开始掌握智能自动化(1/10)
  • 淄博淘宝网站建设企业管理官网登录入口
  • ES6模板字符串
  • Dart 语法核心 7 讲:变量 + 常量 + 数据类型 + 空安全 + 运算符 + 流程控制 + 函数
  • 【Android】活动的正/异常生命周期和启动模式、标志位详解
  • AI换脸技术安全指南:3条法律红线与合规实践
  • 【2025-11-01】软件供应链安全日报:最新漏洞预警与投毒预警情报汇总
  • 使用thefuck报错ModuleNotFoundError: No module named ‘distutils‘
  • 算法23.0
  • 怎么做免费的网站推广网站正在建设中 html 模板
  • 鸿蒙Flutter三方库适配指南:10.插件测试
  • 购物车高效开发指南:API与Vuex实战
  • 广州网站建设公司哪家好展厅设计制作
  • 【BFS 解决FloodFill 算法】4. 被围绕的区域(medium)
  • Go channel 的核心概念、操作语义、设计模式和实践要点
  • 现在还可以做夺宝网站怎么让网站被百度搜到
  • 深蓝汽车10月全球销量36792辆 S05销量突破2万辆
  • 四、CSS选择器(续)和三大特性
  • 高职新能源汽车技术专业职业发展指南