
目录前言1. 非空约束2. 默认值3. 列描述4. zerofill5. 主键6. 自增键7. 唯一键8. 外键前言MySQL 的约束主要用于限制表中数据的取值范围和数据之间的关系保证数据库中的数据符合预期也就是保证数据的完整性。1. 非空约束要求字段不能为空 NULL。实际的业务场景中某些字段必须要有数据创建表时就可以在该字段后面加上NOT NULL即要求在插入数据时必须给该字段赋值否则报错。例如createtablestudent(idint,namevarchar(20)notnull);此时insertintostudent(id,name)values(1,null);就会插入失败保证了某些重要字段必须要有数据2. 默认值某个字段可能具有比较确定的值就可以在一开始指定默认的值插入时可以选择性的使用默认值。比如描述一个学生的性别可以设置默认值为男。插入数据时如果不指定性别就默认男。例如createtablestudent(idintnotnull,namevarchar(20)notnull,genderchar(2)default男);插入数据时可以指定也可以选择默认值insertintostudent(id,name)values(1,张三);insertintostudent(id,name,gender)values(2,李四,女);NOT NULL 字段也可以设置默认值当我们没有给字段传值时就会自动填入一个默认合法的值。实例mysqlcreatetabletest(-aintnotnulldefault123,-schar(8)notnull-);mysqlinsertintotest(s)values(hello);mysqlselect*fromtest;------------|a|s|------------|123|hello|------------3. 列描述comment类似于c/c中的注释用来描述相关字段会根据表创建语句保存。例如mysqlcreatetableuser(-namevarchar(20)comment用户名,-accountvarchar(32)comment账号,-passwordchar(12)comment密码-);4. zerofill当我创建一个表desc table_name就可以看到各个字段的属性。mysqldesct2;----------------------------------------------------|Field|Type|Null|Key|Default|Extra|----------------------------------------------------|a|int(11)|YES||NULL|||b|int(10)unsigned|YES||NULL||----------------------------------------------------int(11)int(10) unsigned中的 11 和 10 其实是有符号整型和无符号整型数的显示宽度有符号整型类型比无符号整型多一个符号位。int范围-2147483648 ~ 2147483647不管int(5)还是int(8)该字段的取值范围不变。当搭配zerofill就会显示指定的宽度不够补 0。实例mysqlcreatetablet3(-aint(5)zerofill,-bint(5)-);mysqlinsertintot3(a,b)values(12,12);mysqlselect*fromt3;-------------|a|b|-------------|00012|12|-------------5. 主键主键primary key用来唯一标识表中的一条数据不能为空不能重复。例如createtablestudent(idintprimarykey,namevarchar(20)notnull);1复合主键一张表只能有一个主键但一个主键可以由多个字段共同组成称为“复合主键”。比如有一张学生选课的课表student_id course_id score110190110285210195210388student_id不能单独作为主键因为一个学生可以选多门课程。course_id也不能单独作为主键因为一门课可以被多个学生选择。但是student_idcourse_id可以唯一确定一条选课记录所以可以使用复合主键注意写法createtablestudent_course(student_idint,course_idint,scoreint,primarykey(student_id,course_id));mysqlselect*fromstudent_course;------------------------------|student_id|course_id|score|------------------------------|1|123|80||1|124|85||2|123|90||2|124|80|------------------------------2添加主键创建表时没有主键可以追加主键altertable表名primarykey(字段列名);注意如果该字段在表中的有重复的数据就会失败3删除主键altertable表名dropprimarykey;6. 自增键自增键auto_increment如果不给值就会从1或者按照当前计数器开始以步长为1递增。自增键字段必须先得是主键该字段类型必须是整型一张表只有一个自增键例如createtablet4(idintprimarykeyauto_increment,namechar(12));mysqlinsertintot4(name)values(a);mysqlinsertintot4(name)values(b);mysqlselect*fromt4;----------|id|name|----------|1|a||2|b|----------mysqlinsertintot4(id,name)values(5,c);mysqlinsertintot4(name)values(d);mysqlselect*fromt4;----------|id|name|----------|1|a||2|b||5|c||6|d|----------7. 唯一键在实际的业务场景中可能不光要求主键字段是唯一的还有一些字段也可能是唯一的。但一张表只有一个主键为了满足对其它字段唯一性的约束需求所以引入了唯一键。唯一键可以有多个唯一键可以为空允许多个为空空字段不作唯一性比较例如一个学生的学号作为主键唯一所有人的号码也是唯一的可以将号码字段设置为唯一键。createtablestu(idintprimarykey,namevarchar(20)notnull,numchar(12)unique);mysqlinsertintostuvalues(1,张三,123456);mysqlinsertintostuvalues(2,李四,456789);mysqlinsertintostuvalues(3,lisa,null);mysqlinsertintostuvalues(4,rose,null);mysqlselect*fromstu;--------------------|id|name|number|--------------------|1|张三|123456||2|李四|456789||3|lisa|NULL||4|rose|NULL|--------------------主键可以理解为主键 唯一键 NOT NULL。8. 外键外键用于维护主表和从表之间的数据关系。外键关系定义在从表主表中相关字段必须是主键或唯一键语法foreignkey(从表列名)references主表(主表列名)例如维护学生表与班级表学生应该属于不同的班级。# ------------------主表----------------------------------createtableclass(idintprimarykey,class_namevarchar(12));# -------------------从表---------------------------------createtablestu(idintprimarykey,namevarchar(20),class_idint,foreignkey(class_id)referencesclass(id));此时-----------------|id|class_name|-----------------|101|一班||102|二班|-----------------如果从表插入的数据的class_id不在主表的id中就会失败。如果从表中有一条数据| 3 | 张三 | 101 |如果想要删除主表的|101 | 一班 |字段也会失败。mysqldeletefromclasswhereid101;ERROR1451(23000): Cannotdeleteorupdatea parentrow: aforeignkeyconstraintfails(db1.stu,CONSTRAINTstu_ibfk_1FOREIGNKEY(class_id)REFERENCESclass(id))外键约束要求子表中的外键值必须与父表中被引用的键建立合法对应关系从而保证表与表之间的数据一致性。