MySQL 表的约束(一)
文章目录
- 表的约束
- 空属性
- 默认值
- 列描述
- zerofill
- 主键
- 总结
表的约束
1. 为什么要有表的约束?
因为要保证数据的完整性和可约束性,合法性
空属性
- 两个值:null(默认的)和not null(不为空)
- 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
- not null 是不允许插入的是空值
- 案例
create table myclass(
class_name varchar(20) not null,
class_room varchar(20) not null,
other varchar(20)
);
insert into myclass (class_name,class_room,other) values('高三3班','101教室','普通班');
// 默认的是可以为空的
insert into myclass (class_name,class_room) values('高三3班','101教室');
// 该句是错误的, 是不允许插入的是空值,约束
insert into myclass (class_name,class_room) values('高三3班',null);
默认值
- 默认值:一开始就设定好的值,如果用户不输入值,就使用默认设定的值,如果用户输入了值,就使用用户输入的值
create table t13(
name varchar(20) not null,
age tinyint unsigned default 18,
gender char(1) default '男'
);
insert into t13 (name,age,gender) values('张三',19,'女');
insert into t13 (name) values('李四');
2. 如果既设置了not null 又设置了default,不显示写列名是可以的,默认插入的就是default值
3. not null 和 default 的使用
4. 如果显示地设置为了 not null,mysql是不会给你自动加上default的
列描述
- 列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
- 列描述就像我们写的注释一样
create table t15(
name varchar(20) not null comment '这个是用户的姓名',
age tinyint unsigned default 18 comment '这个是用户的年龄',
gender char(1) default 18 comment '这个是用户的性别'
);
zerofill
- zerofill是用于进行宽度的填充的,如果少于给定的宽度,那么会在该数字的前面加上0,比如int(10),10再加上zerofill就表示填充宽度是10
2. 修改约束,将列b的属性修改为int(1) unsigned zerofill
3. zerofill 如果宽度足够就按照你写的原样写出,如果不够宽度填充0,下图的填充宽度为4
4. zerofill 默认的无符号整数是 2 ^ 32 - 1,是10位,有符号整数是 -2 ^ 31 ~ 2 ^ 31 - 1,是11位
主键
- 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
// 对id进行主键约束
create table test_key(
id int unsigned primary key comment '学号不能为空',
name varchar(20) not null
);
- 案例
PRI表示这个列属性是主键
2. 主键冲突,相同的key不允许插入
3. 根据主键的唯一性可以修改对应的列属性
4. 去掉该表中的主键
alter table test_key drop primary key;
5. 建好表之后添加主键
alter table test_key add primary key(id);
// 删除名字为孙权的列
delete from 表名 where name='孙权';
6. 复合主键:不意味着一个表中的主键,只能添加给一列,一个主键可以被添加到一列或者多列上
// 规定一个学生只能选择一门课程
// id和course_id合起来不重复
// 也就是同一个人可以选择多门课程,一个课程可以被多个人选择
// 但是一个人不能选择两次同一门课程
create table t18(
id int unsigned,
course_id int unsigned comment '课程编号',
score tinyint unsigned comment '这个学生改门课程考的分数',
primary key(id,course_id)
);
7. 不能插入id和course_id都相同的主键
总结
1. 主键是用来衡量一行一行表中的信息是唯一的,主键是唯一的
2. 复合主键两个合起来是唯一的