在MySQL中,表的约束用于强制保证数据的完整性和一致性。在数据库表中,真正约束字段的是数据类型,数据类型传送门:CSDN
https://mp.csdn.net/mp_blog/creation/editor/145947883但是数据类型的约束很单一,所以需要一些额外的约束,来保证数据的完整性和正确性。表的约束有很多,这里主要介绍如下几个:
null / not null,default,comment,zerofill,primary key,auto_increment,unqiue key

示例:
create table if not exists myclass( class_name varchar(20) not null,class_room varchar(20) not null);

insert into myclass values ('高三一班','101'); insert into myclass values (null,'101');//err不能插入空值 insert into myclass values ('高三一班',null);//err不能插入空值

插入数据时,若未指定字段,则使用默认值。
示例:
create table t11( -> name varchar(20) not null, -> age tinyint unsigned default 10, -> sex char(2) default '男');

数据在插入时,不给字段赋值就是用默认值。
insert into t11 (name,age) values ('张三',18); insert into t11 (name,age,sex) values ('李四',20,'女'); insert into t11 (name,sex) values ('王五','男'); insert into t11 (name) values ('赵六');

补充:我们可以查看建表时我们设置了那些约束
show create table t11\G

在创建表时,如果没有指明字段的约束,系统会将字段的默认值default设置为null

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,起到注释的作用
示例:
mysql> create table t13( -> name varchar(20) not null comment '姓名', -> age tinyint unsigned default 0 comment '年龄', -> sex char(2) default '男' comment '性别');
通过desc查看不到注释信息,通过show可以查看到

zerofill的作用如果宽度小于给定的宽度,就用0填充。具体看操作.
mysql> create table t14( a int unsigned not null, b int unsigned not null);
mysql> alter table t14 modify b int unsigned zerofill not null;
mysql> show create table t14\G

可以看到int(10),这个10所表示的含义是b这个数的宽度,如果插入的数据宽度小于10,就补0,如果宽度大于10,就按原数据插入。而为什么是10呢?因为无符号int的取值范围是42亿多,宽度是10。
mysql> insert into t14 values (1,1); mysql> insert into t14 values (1,11111111); mysql> insert into t14 values (2,222); mysql> select * from t14;

mysql> alter table t14 change b b int(5) unsigned zerofill;
mysql> show create table t14\G mysql> select * from t14;

可以看到,对于int(10),没有zerofill属性,括号内的值毫无意义。
主键(Primary Key):用来唯一的约束该字段里面的数据,不能为空,不能重复,一张表最多有一个主键;主键所在的列通常是整数类型。
示例:
mysql> create table t15( -> id int unsigned primary key comment '学号不能为空', -> name varchar(20) not null);


alter table 表名 drop primary key;

alter table 表名 add primary key (字段列表);

在创建表的时候,在所有字段之后,使用primary key来创建主键,如果有多个字段做主键,使用复合主键。
mysql> create table t16( -> id int unsigned, -> course char(10) comment '课程', -> score tinyint unsigned default 60 comment '成绩', -> primary key(id,course));

从上图可以看出字段id和course都是主键,id和course共同构成一个主键,站在业务角度,可以保证一个学生对应的学号id,在选课程course时不能选择重复的课程。示例:
mysql> insert into t16 (id,course) values (1,'数据结构'); mysql> insert into t16 (id,course) values (1,'算法设计与分析'); mysql> insert into t16 (id,course) values (1,'操作系统'); mysql> insert into t16 (id,course) values (2,'数据结构'); mysql> insert into t16 (id,course) values (2,'算法设计与分析'); mysql> insert into t16 (id,course) values (2,'操作系统'); mysql> insert into t16 (id,course) values (1,'操作系统');//err主键冲突 mysql> insert into t16 (id,course) values (1,'数据结构');//err主键冲突


auto_increment:当对应的字段,不给值,会自动的被形同触发,系统会从当前已有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
示例:
mysql> create table t17( -> id int unsigned primary key auto_increment, -> name varchar(10) not null);

mysql> insert into t17 (name) values ('a'); mysql> insert into t17 (name) values ('b'); mysql> insert into t17 (name) values ('c');

mysql> show create table t17\G


mysql> create table t18( -> id int unsigned primary key auto_increment, -> name varchar(20) not null)auto_increment=100;



举一个例子:
假设一个场景: 比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一 个是员工工号,我们可以选择身份号码作为主键。 而我们设计员工工号的时候,需要一种约束:所有的员工工号都不能重复。 具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯一键。 一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。
示例:
mysql> create table student( -> id char(10) unique key comment '学号', -> name varchar(10));


外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
作用:维护表间的引用完整性,防止无效数据插入。
语法:
foreign key(字段名) references 主表(列);

其中学生表为从表,班级表为主表。
示例:
mysql> create table class( -> id int primary key, -> name varchar(20) not null comment '班级名'); mysql> create table student( ->id int primary key, ->name varchar(20) not null comment '学生名', ->class_id int, ->foreign key(class_id) references class(id));

mysql> insert into class values (1,'软件101'); mysql> insert into class values (2,'软件102'); mysql> insert into class values (3,'软件103');

mysql> insert into student values (100,'张三',1); mysql> insert into student values (200,'李四',2); mysql> insert into student values (300,'王五',3); mysql> insert into student values (400,'赵六',3); mysql> insert into student values (500,'田七',4);//err


mysql> insert into student values (500,'田七',null);

有一个商店的数据,记录客户及购物情况,有以下三个表组成:
要求:
//创建数据库
mysql> create database d1;
//选择数据库
mysql> use d1;商品:
create table if not exists goods
(
goods_id int primary key auto_increment comment '商品编号',
goods_name varchar(32) not null comment '商品名称',
unitprice int not null default 0 comment '单价,单位分',
category varchar(12) comment '商品分类',
provider varchar(64) not null comment '供应商名称'
);客户:
create table if not exists customer
(
customer_id int primary key auto_increment comment '客户编号',
name varchar(32) not null comment '客户姓名',
address varchar(256) comment '客户地址',
email varchar(64) unique key comment '电子邮箱',
sex enum('男','女') not null comment '性别',
card_id char(18) unique key comment '身份证'
);购买
create table if not exists purchase
(
order_id int primary key auto_increment comment '订单号',
customer_id int comment '客户编号',
goods_id int comment '商品编号',
nums int default 0 comment '购买数量',
foreign key (customer_id) references customer(customer_id),
foreign key (goods_id) references goods(goods_id)
);