阶段一 表约束
1、not null 非空约束
例子:
create table tb1( id int, name varchar(20) not null );
注意 空字符不等于null
#手动,添加非空约束 (必须这个字段,没有NULL值)
mysql> alter table tb1 -> modify id int not null;
# 取消非空约束
mysql> alter table tb1
-> modify id int ;
2、unique key 唯一约束
例子:
create table tb2( id int unique key, name varchar(20) ); # 确保字段中的值的唯一
#添加唯一约束 mysql> alter table tb2 -> add unique key(name) ->;
#删除唯一约束 mysql> alter table tb2 -> drop key name;
3、主键约束 primary key
主键的作用:可以唯一标识一条数据,每张表里面只能有一个主键,。主键的主要目的是帮助MySQL以最快的速度查找到表中的某一条信息
主键特性:非空且唯一。当表里没有主键的时,第一个出现的非空且为唯一的列,被当成主键。
例子:
create table tb3( id int primary key, name varchar(20) not null );
#删除主键约束 mysql -> alter table tb3 -> drop primary key;
4、自增长 auto_increment
auto_increment :自动编号,一般与主键组合使用。一个表里面只有一个自增默认情况下,起始值为1,每次的增量为1。
例子:
create table tb5( id intprimary key auto_increment, name varchar(20) )auto_increment=100;
#删除自动增长 mysql> alter table tb5 -> modify id int;
#增加自动增长auto_increment mysql> alter table tb5 -> modify id int auto_increment;
5、默认约束 default
default :初始值设置,插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
例子:
create table tb6( id int primary key auto_increment, name varchar(20) not null, age int not null default 18 );
# 删除default mysql> alter table tb6 -> modify age int;
# 手动添加default mysql> alter table tb6 -> modify age int default 20;
6、外键约束 foreign key
外键约束 :保持数据一致性,完整性实现一对多关系。
外键必须关联到键上面去,一般情况是,关联到另一张表的主键
(因为一个表只存一类信息。用外键来做参照,保证数据的一致性,可以减少数据余)
##表a create table a( a_id int primary key auto_increment, a_name varchar(20) not null ); insert into a values(1,'a1'),(2,'a2'); ##表b create table b( b_id int primary key, b_name varchar(20) not null, fy_id int not null, constraint AB_idforeign key(fy_id)references a(a_id) ); insert into b value(1,'aa',2);
#删除外键 alter table b drop foreign key AB_id;
#增加外键 mysql> alter table b -> add constraint AB_id foreign key(fy_id) references a(a_id);
# B表中的fy_id 字段,只能添加 a_id中已有的数据。
# A表中a_id 被参照的数据,不能被修改和删除
阶段二 表关系
1、一对一关系 (学生详细)
一对一 : 用外键的方式,把两个表的主键关联
举例,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表来存放。这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用主键加主键的方式来实现这种关系。
# 学生表 mysql> create table student( -> s_id int primary key, -> sex varchar(20), -> age int); # 插入数据 mysql> insert into student value(1,'男',22); # 学生详细表 mysql> create table student_x( -> id int primary key, -> name varchar(20), -> foreign key (id) references student(s_id) -> ); # 插入数据 mysql> insert into student_x value(1,'zcm'); # 查看 mysql> select * from student_x; +----+------+ | id | name | +----+------+ | 1 | zcm | +----+------+ mysql> select * from student; +------+------+------+ | s_id | sex | age | +------+------+------+ | 1 | nan | 22 |
2、一对多关系 (学生所属学院)
举例,通常情况下,学校中一个学院可以有很多的学生,而一个学生只属于某一个学院。学院与学生之间的关系就是一对多的关系,通过外键关联来实现这种关系。
注意:学生表中 只能添加 ,已有的学院id
##创建学院表 create table department( d_id int primary key auto_increment, # 学院id d_name varchar(20) not null # 学院名 ); ##创建学生表 create table student( s_id int primary key auto_increment, # 学生id s_name varchar(20) not null, # 学生名字 dept_id int not null, # 所属学院 id constraint SD_id foreign key(dept_id) references department(d_id) #外键 ); # 插入数据 insert into department values(1,'外语学院'),(2,'计算机学院'); insert into student values(1,‘张三',2),(2,‘李四',1); # 查看 mysql> select * from department; +------+-----------------+ | d_id | d_name | +------+-----------------+ | 1 | 外语学院 | | 2 | 计算机学院 | +------+-----------------+ mysql> select * from student_1; +------+--------+---------+ | s_id | s_name | dept_id | +------+--------+---------+ | 1 | 张三 | 2 | | 2 | 李四 | 1 | +------+--------+---------+
3、 多对多关系 (学生选课)
举例,学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。对于多对多关系,需要创建中间表 实现。
# 建立学生表 mysql> create table student_d( -> s_id int primary key auto_increment, -> s_name varchar(20) not null -> ); # 建立课程表 mysql> create table cours( -> cours_id int primary key auto_increment, -> cours_name varchar(20) not null -> ); # 选课表(中间表) mysql> create table ele( -> s_id int, # 用来记录学生id -> cours_id int, # 用来记录课程id -> primary key(s_id,cours_id), # 联合主键 -> foreign key(s_id) references student(s_id), # 关联学生id -> foreign key(cours_id) references cours(cours_id) # 关联课程id -> ); # 插入数据 insert into student_d values(1,'张三'),(2,'李四'),(3,'王六'); insert into cours values(1,'python编程'),(2,'大学英语'),(3,'音乐鉴赏'); insert into ele values(1,3),(2,1),(3,2); # 查看 mysql> select * from student_d; +------+--------+ | s_id | s_name | +------+--------+ | 1 | 张三 | | 2 | 李四 | | 3 | 王六 | +------+--------+ 3 rows in set (0.00 sec) mysql> select * from cours; +----------+--------------+ | cours_id | cours_name | +----------+--------------+ | 1 | python编程 | | 2 | 大学英语 | | 3 | 音乐鉴赏 | +----------+--------------+ 3 rows in set (0.00 sec) mysql> select * from ele; +------+----------+ | s_id | cours_id | +------+----------+ | 2 | 1 | | 3 | 2 | | 1 | 3 | +------+----------+ 3 rows in set (0.00 sec)