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

[MySQL]约束

画师:竹取工坊
大佬们好!我是Mem0rin!现在正在准备自学转码。
如果我的文章对你有帮助的话,欢迎关注我的主页Mem0rin,一起进步!


文章目录

    • 一、约束概述
      • (一)通用语法
      • (二)常用约束
    • 二、基本字段约束
      • (一)通用语法
      • (二)示例
    • 三、主键约束(`UNIQUE` + `NOT NULL`)
      • (一)通用语法
      • (二)自增类型(`AUTO_INCREMENT`)
      • (三)示例
    • 四、外键约束
      • (一)通用语法
      • (二)示例

文本使用 ChatGPT 进行二次整理。

约束用于限制表中数据的取值,保证数据的完整性和正确性。把常见校验交给数据库完成,可以减少人工检查和程序判断。

一、约束概述

(一)通用语法

约束可以直接写在字段后,也可以作为表级约束统一定义。

-- 在字段后定义约束CREATETABLEtable_name(column_name data_typeconstraint);-- 使用表级约束CREATETABLEtable_name(column1 data_type,column2 data_type,CONSTRAINTconstraint_nameconstraint(column1,column2));

(二)常用约束

约束作用
NOT NULL字段必须有值,不能存储NULL
UNIQUE字段值不能重复(eg. 身份证号)
DEFAULT未赋值时使用默认值
PRIMARY KEY唯一标识一条记录,相当于非空(NOT NULL)且唯一(UNIQUE)
FOREIGN KEY保证当前表的值能在关联表中找到
CHECK保证字段值满足指定条件

MySQL 8.0.16 起开始真正执行CHECK约束;更早版本只解析语法而不进行校验。具体说明可参考 MySQL 官方文档。

二、基本字段约束

(一)通用语法

-- 非空约束column_name data_typeNOTNULL-- 唯一约束column_name data_typeUNIQUE-- 默认值约束column_name data_typeDEFAULTdefault_value-- 检查约束column_name data_typeCHECK(condition)

NOT NULL适合姓名、编号等必填字段;UNIQUE适合学号、身份证号等不能重复的字段;DEFAULT用于提供缺失值。

(二)示例

-- 创建学生表并添加常用约束CREATETABLEstudent(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULLDEFAULT'无名氏',snINTNOTNULLUNIQUE,ageINTCHECK(age>=0));-- 查看表结构DESCstudent;-- 不指定 id,由数据库自动生成INSERTINTOstudent(name,sn,age)VALUES('张三',10001,20);

三、主键约束(UNIQUE+NOT NULL)

(一)通用语法

-- 单列主键CREATETABLEtable_name(idBIGINTPRIMARYKEY);-- 复合主键CREATETABLEtable_name(column1 data_type,column2 data_type,PRIMARYKEY(column1,column2));

一张表只能有一个主键,但主键可以由多个字段组成。主键会增加少量写入校验开销,但能保证每条记录可以被唯一标识,因此这样的性能消耗是可以承担的。

(二)自增类型(AUTO_INCREMENT

AUTO_INCREMENT通常与整数主键配合使用。插入数据时可以省略主键字段,由数据库负责维持逐渐的增长。删除记录、回滚事务或手动指定主键后,自增值可能不连续。

(三)示例

-- 创建createtablestudent(idbigintnotprimarykeyauto_increment,-- 设定主键namevarchar(50)default'无名氏',snintnotnullunique);-- 查看表descstudent-- 插入 NULL 报错insertintostudentvalues(NULL,'张三',10001);-- 不具体指定主键列的值,数据库执行自增操作insertintostudentvalues('李四'10002);-- 数据库自己执行自增操作insertintostudentvalues(100,'王五',10003);-- 手动指定主键值,后续主键从 101 开始-- 创建复合主键,只有 id 和 name 的组合不能重复CREATETABLEaccount(idBIGINT,nameVARCHAR(20),emailVARCHAR(50),PRIMARYKEY(id,name));-- 两组主键组合不同,可以正常插入INSERTINTOaccount(id,name,email)VALUES(1,'张三','zs@example.com'),(1,'李四','ls@example.com');

四、外键约束

(一)通用语法

-- 当前表的字段引用关联表中的字段FOREIGNKEY(column_name)REFERENCESreferenced_table(referenced_column)

外键通常引用另一张表的主键或UNIQUE字段。插入子表数据时,被引用的值必须已存在;存在关联数据时,也不能直接删除对应的父表记录。

(二)示例

-- 创建班级表CREATETABLEclass(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULL);-- 创建学生表,并让 class_id 引用班级编号CREATETABLEstudent_detail(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULL,class_idBIGINT,FOREIGNKEY(class_id)REFERENCESclass(id));-- 先插入班级,再插入对应的学生INSERTINTOclass(name)VALUES('101班'),('102班');INSERTINTOstudent_detail(name,class_id)VALUES('张三',1),('李四',2);

如果插入不存在的class_id,或直接删除仍被学生记录引用的班级,数据库会拒绝该操作。

http://www.jsqmd.com/news/1228836/

相关文章:

  • 嵩山少林小龙文武学校:文武双修,成就孩子的非凡人生 - 全国文武学校招生
  • 用AI写了几十篇博客后,我只觉得得不偿失
  • FaceAISDK:Android离线人脸识别与活体检测的终极解决方案
  • 新疆旅游景点推荐与可视化平台设计与实现开题报告
  • Chat2DB 智能问数工程化:从 Schema 理解到 SQL 审核闭环
  • Embedding 和向量库:RAG 的地基,一次讲透
  • 计算机毕业设计之django基于 Python 的仓库管理系统设计与实现
  • 大模型服务化与平台化:AI中台的架构设计与落地思考
  • Nextcloud全文搜索技术实现:构建高效文件检索系统的完整指南
  • 2026通辽家装装修公司推荐排行 本土口碑标杆榜 - 极欧测评
  • 金仓发布制造场景数据库演进白皮书:SQL Server替代进入“深水区”
  • Miles vs Slime:两大强化学习框架核心功能对比与选型建议
  • C++实现一元多项式运算:链表设计与运算符重载实践
  • Bonsai-8B-GGUF:如何实现1位量化模型在边缘设备的高效部署实践
  • XBIT Wallet:DEX钱包如何实现ETF链上资产管理
  • KTransformers:CPU-GPU 异构计算驱动的大模型推理与微调框架深度解析
  • .NET CORE 动态扩展Options-配置运行时热更新
  • Flipper Zero终极指南:从入门到精通的全方位资源宝典
  • 【粉丝福利社】可视艺术用可视化路径赋能数据分析
  • AI自然语言查询总出错?这8类语义解析陷阱90%团队从未察觉,附Prompt工程校准清单
  • M12 X-Code 8芯 PoE 相机/远程IO 针脚定义完整详解
  • Spring Boot3中分布式事务与本地事务的冲突与解决方案
  • AI音乐商用版权合规实战手册(含BBC/Spotify/网易云最新授权模板)
  • 深入解析EDMA3事件与中断寄存器:嵌入式DMA高效数据搬移的核心机制
  • 如何在code-server中搭建3种AI编程助手?从Copilot到本地模型全攻略
  • 华硕笔记本性能优化终极指南:如何用G-Helper实现一键智能控制
  • 如何在《鸣潮》中自定义游戏体验?AES密钥与模组制作完全解析
  • C++高并发内存池实现:三层架构设计与性能优化实战
  • Fun-ASR社区生态与未来发展:路线图、贡献指南与社区支持资源
  • 一週間でなれる!スパコンプログラマ:7日間でMPIと並列計算をマスターする完全ガイド