一:约束条件之主键
1.什么是主键?
- 从约束条件的角度,主键是非空且唯一的字段 not null unique
create table t1(
id int not null unique,
name varchar(32)
);
2.主键的特点
主键可以加快数据查询,类似于新华字典的目录
1.InnoDB存储引擎规定,mysql必须有且只有一个主键
2.当表中没有主键字段或者非空且唯一的字段的时候,mysql会自动创建一个隐藏的主键字段
3.如果创建的表中没有主键字段,而有非空且唯一的字段,InnoDB存储引擎会自动将该字段设置为主键
4.创建表的时候都应该有一个’id’字段,并且该字段为主键(eg:udi,sid,eid…)
5.联合主键:几个字段公用一个主键
create table t3(
nid int,
sid int,
primary key(nid, sid)
);
6.主键的自增 auto_increment
- 该约束条件不能单独使用 必须跟在键后面(主要配合主键一起使用)
- 自增的特点:自增的操作不会因为删除数据的操作而回退和重置
create table t4(
id int primary key auto_increment,
name varchar(32)
);
7.重置主键: truncate 表名; 删除表数据并重置主键值
二:约束条件之外键
1.什么是外键?
专门用来记录表与表之间数据的关系
2.表与表之间数据的关系
3.如何判断表与表之间的关系
- 方法:换位思考,即:站在不同的表的角度上分析,看该表与其他表之间是否是一对多关系
4.sql语句建立表关系的顺序
- 1.先写普通字段
- 2.再写外键字段
- 3.先创建被关联的表(没有外键)
- 4.然后再是关联表(有外键)
5.有外键的表的数据操作
- 1.插入表数据的时候 针对外键字段只能填写被关联表字段已经出现过的数据值
- 2.被关联字段无法修改和删除
- 级联更新、级联删除 被关联数据一旦变动 关联的数据同步变动
三:三种关系表的建立
1.一对多
1.什么是一对多表关系?
如下图:员工表中的每一条员工数据只能对应部门表中的一条部门数据,而部门表中的每一条部门数据够对应员工表中的多条员工数据,这种关系就是一对多的表关系。
2.图示:
3.sql语句创建一对多表关系
外键建在多的一方
create table dep(
id int primary key auto_increment,
name varchar(32)
);
create table emp(
id int primary key auto_increment,
name varchar(32),
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
2.多对多
1.什么是多对多表关系?
如下图所示:书籍表中的每一条书籍数据可以对应作者表中的多条作者数据,而作者表中的一条作者数据也能对应书籍表中的多条书籍数据,这种关系就是多对多的关系
2.图示:
3.sql语句创建多对多表关系
需要单独创建第三张表来存储这种关系,外键建在第三张表中
create table Book(
id int primary key auto_increment,
name varchar(32)
);
create table Author(
id int primary key auto_increment,
name varchar(32)
);
create table Author2Book(
id int primary key auto_increment,
author_id int,
foreign key(author_id) references Author(id)
on update cascade
on delete cascade,
book_id int,
foreign key(book_id) references Book(id)
on update cascade
on delete cascade
);
3.一对一
1.什么是一对一表关系?
如下图所示:用户表中的每一条数据只能对应用户详情表中的一条数据,用户详情表中的每一条数据也只能对应用户表中的一条数据,这种关系就是一对一
2.图示:
3.sql语句创建多对多表关系
外键建在任意一方都可以,建议建在调用频率高的一方
create table user(
id int primary key auto_increment,
name varchar(32),
detial_id int unique,
foreign key(detial_id) references user_detial(id)
on update cascade
on delete cascade
);
create table user_detial(
id int primary key auto_increment,
age int,
phone bigint
);
|