数据库约束与表的设计
数据库约束
not null —>非空约束
创建表时,指定某列不为空(null)
;
举例:
创建学生表结构,并指定id
不为空;
mysql> create table student(
-> id int not null,
-> sn int,
-> name varchar(20)
-> );
指定为非空约束后,就不能再插入空(null
)了,否则报错;
unique ---->唯一约束
指定某列是唯一的,不重复的
;
举例:
创建学生表结构,指定id
不为空,学号唯一;
mysql> create table student(
-> id int not null,
-> sn int unique,
-> name varchar(20)
-> );
指定唯一约束后,就不能添加重复数据在表中,否则就会报错;
default ---->默认值约束
指定插入数据时,某列为空就默认为unkown:
举例:
设置:name
列为空时,使用默认值unknown
;
mysql> create table student(
-> id int not null,
-> sn int unique,
-> name varchar(20) default 'unknown'
-> );
注意
:
- 插入四条数据,空字符串(
' '
)和空(null
)的显示是不一样的哦~
mysql> insert into student values
-> (1,1001,null),
-> (2,1002,'小花'),
-> (3,1003,''),
-> (4,1004,'小猪');
查询结果:
- 插入时,只有不指定该字段,才能显示以默认值的形式插入,如果指定,哪怕是
null
,也会真实的插入,如上所示;
mysql> insert into student (id,sn) values(7,1008);
查询结果:
primary key—>主键约束
not null 和 unique 的结合体,确保某列(多列)有唯一标识,便于查询、删除、修改数据
;
举例:
创建学生表结构,id
设为主键;
mysql> create table student(
-> id int primary key,
-> sn int unique,
-> name varchar(20) default 'unknown'
-> );
对于整数类型的主键,常常搭配 auto_increme 来使用;
表示从1开始自增,但插入数据时,不要指定主键字段
;
场景:
创建课程表,id
为整形数字的主键,如下所示:
mysql> create table course(
-> id int primary key auto_increment,
-> name varchar(20)
-> );
插入数据,但不要指定主键字段:
mysql> insert into course(name) values
-> ('高等数学'),
-> ('大学英语'),
-> ('智能控制');
查询结果:
foreign key---->外键约束
foreign key
:用于关联其他表的主键或唯一键;
语法
:
foreign key (本表字段名) references (关联表的表名)(关联的字段名)
举例:
- 创建班级表
classes
,id
为主键; - 创建学生表
student
,一个学生对应一个班级,一个班级对应多个学生,使用id
为主键,classes_id
为外键,关联班级表id
;
mysql> create table classes(
-> id int primary key auto_increment,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> drop table if exists student;
Query OK, 0 rows affected (0.00 sec)
mysql> create table student(
-> id int primary key auto_increment,
-> sn int unique,
-> name varchar(20) default 'unknown',
-> classes_id int,
-> foreign key (classes_id) references classes(id)
-> );
插入数据:
- (1) 插入班级信息
查询结果:
- (2)插入学生信息
mysql> insert into student (sn,name,classes_id) values
-> (1001,'李宁',1),
-> (1002,'张伟',1),
-> (1003,'乔丹',2);
查询结果:
李宁、张伟均在计算机1班,乔丹在计算机2班;
表的设计
一对一
一个人对应一个身份证信息
一对多
一个班级拥有多个学生
多对多
一个学生,要修多门课程
注意:
- 表的直接关系只有:1对1 、1对多;
多对多的关系,是中间表产生的中间关系
;
举例:
班级表、学生表、考试成绩表,总共有三张表,在考试的场景发生后,就有学生和课程多对多的对应关系了!
- 考试成绩表
- 课程表
- 班级表
插入数据:
mysql> insert into score values
-> (null,59,8,1),
-> (null,70,8,2),
-> (null,87,9,2),
-> (null,69,10,1),
-> (null,99,8,1);
结果查询:
内容总结
约束类型 | 说明 |
---|---|
not null | 表示某列不能存储 null 值 |
unique | 保证某列的每行必须有唯一的值 |
default | 规定没有给列赋值时的默认值 |
primary key | not null 和unique 的结合 |
foreign key | 保证一个表中的数据匹配另一个表中的值的参照完整性 |