[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字段必须有值不能存储NULLUNIQUE字段值不能重复eg. 身份证号DEFAULT未赋值时使用默认值PRIMARY KEY唯一标识一条记录相当于非空NOT NULL且唯一UNIQUEFOREIGN 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(age0));-- 查看表结构DESCstudent;-- 不指定 id由数据库自动生成INSERTINTOstudent(name,sn,age)VALUES(张三,10001,20);三、主键约束(UNIQUENOT NULL)一通用语法-- 单列主键CREATETABLEtable_name(idBIGINTPRIMARYKEY);-- 复合主键CREATETABLEtable_name(column1 data_type,column2 data_type,PRIMARYKEY(column1,column2));一张表只能有一个主键但主键可以由多个字段组成。主键会增加少量写入校验开销但能保证每条记录可以被唯一标识因此这样的性能消耗是可以承担的。二自增类型AUTO_INCREMENTAUTO_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,张三,zsexample.com),(1,李四,lsexample.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或直接删除仍被学生记录引用的班级数据库会拒绝该操作。

本月热点