mysql 基础二
阶段一 表约束
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)
来源: http://www.bubuko.com/infodetail-2639561.html