表的约束
约束的作用就是通过一定的手段限制别人不要向表中乱写入数据,数据类型就是约束条件的一种。比如往bit类型列插入字符串这种错误的行为就会被约束。
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
常见的表的约束有,空属性,默认值,列描述,主键,唯一键,外键约束等等。
空属性
空属性有两个值:
null
允许为空not null
不允许为空- 数据库默认字段基本都是允许为空的,但在实际开发中我们要尽可能保证字段不为空,因为空值无法参与运算。
如果要让某个字段不允许为空,在创建表的时候就可以给对应字段设置not null属性。
使用示例
- 创建一个用户表,包含用户姓名和性别。
在正常的逻辑角度上,每个人都有姓名和性别,所以这里可以将他们设置为非空属性。
create table user_tb(
name varchar(20) not null,
sex set('男','女') not null
]);
插入数据时,必须插入姓名和性别,只插入一个就会错误。
默认值
和C++语言的缺省值是一样的。
- 如果某一个字段会经常性的出现某个值,那么就可以考虑将这个值设置成该字段的默认值。
- 向表中插入数据时如果不给带有默认值的字段赋值,那么就会使用默认值进行插入。
使用示例
创建一个用户表,性别默认是男,不指定插入就是不男的。
create table user_tb(
name varchar(20) not null,
sex char(2) default '男'
);
向表中添加数据
列描述
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA(数据库管理员)来进行了解。
和代码当中的注释一样。
使用示例
create table comment_test(
name varchar(20) not null comment '姓名',
sex char(2) default '男' not null comment '性别 默认为男'
);
通过desc查看不到注释信息,只有通过show 才能看到
zerofill
- 数值类型后面的圆括号中的数字,代表的是显示宽度,对应数值类型设置zerofill属性后,如果数据的宽度小于设定的宽度则自动填充0。
括号的里的这玩意是显示宽度,不是所占字节数。如果没有zerofill这个属性,括号内的数字是毫无意义的。
使用示例
- 创建一个表
create table zerofill_test(
num1 int(5),
num2 int(5)
);
这个5是显示宽度,不是所占字节数。当然这里没有设置zerofill属性,这里没意义。
向表中插入数据,宽度不足5的自动补0显示
zerofill属性的作用就是让数据以特定的方式进行显示而已。底层存储的数据还是1。
主键约束
主键:primary key
用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
使用示例
创建一个学生表,指定学号做为主键。
create table stu_tb(
id int primary key comment '学号不能为空',
name varchar(20) not null
);
- 主键约束:主键对应得字段不能重复,一旦重复,插入失败。也就是说在stu_tb表中学号不能重复,插入重复得学号会插入失败。也不能为空。
- 删除主键
alter table 表名 drop primary key
- 当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表)
- 复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段 作为主键,可以使用复合主键。
使用示例
创建一个进程表,ip地址和端口号做为复合主键
create table process_tb(
ip varchar(30) comment 'ip地址',
port int comment '端口号',
primary key(ip,port) comment 'ip地址和端口号做为复合主键'
);
表结构
向表中添加数据,只有当IP地址和端口号都冲突时,才会插入失败。
自增长
auto_increment
:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
使用示例
create table increment_test(
id int primary key auto_increment,
name varchar(10) not null default ''
);
表结构
向表中插入数据时,id不指定值时会自增长。
当指定值后,从指定的值后开始自增。
一般自增长字段设置后就不需要手动为该字段插入值了,直接让其从1开始进行自增长即可。
唯一键unique
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以 解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
需要注意的是,不是主键具有唯一性,而是某个具有唯一性的字段被选择成为了主键,而那些不是主键但是同样需要唯一性约束的字段就应该设置成唯一键。
使用示例
创建一个学生表,将学号设置为主键,身份证号设置成为唯一键
create table stu_tb(
id int primary key,
id_card char(18) unique comment '身份证号做为唯一键',
name varchar(20)
);
表结构:
向表中插入数据。
外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
foreign key (字段名) references 主表(列)
使用示例
如果将班级表中的数据都设计在每个学生表后面,那么就会出现数据冗余,设计的时候将stu表的class_id,和myclass 表的id形成关联的关系。这就是外键约束
- 按照上面的图创建两个表 先创建主表myclass(主表必须有主键或者唯一键约束)
create table myclass(
id int primary key,
name varchar(30) not null
);
- 在创建从表stu
create table stu(
id int primary key,
name varchar(30) not null,
class_id int,
foreign key (class_id) references myclass(id)--定义外键
);
- 正常擦插入数据
- 插入一个class_id为null的学生插入成功。(外键可以为null)