MySQL进阶part2

约束条件

unique——唯一

# 单列唯一create table t3(id int unique,    name char(16));insert into t3 values(1,‘jason‘),(1,‘egon‘);insert into t3 values(1,‘jason‘),(2,‘egon‘);
# 联合唯一(两个分开都可以重复 但是加载一起必须是唯一的)create table t4(id int,    ip char(16),    port int,    unique(ip,port));insert into t4 values(1,‘127.0.0.1‘,8080);insert into t4 values(2,‘127.0.0.1‘,8081);insert into t4 values(3,‘127.0.0.2‘,8080);insert into t4 values(4,‘127.0.0.1‘,8080);  报错

primary key 主键(非空切唯一)

create table t5(id int primary key);insert into t5 values(null); # 错误insert into t5 values(1),(1); # 重复错误insert into t5 values(1),(2); ps:在创建表的时候id字段一定要加primary key

auto_increment(自增)

# 编号太多的情况下适用create table t8(id int primary key aotu_increment,name char(16));ps:在创建表的时候id字段一定要加primary key aotu_incrementdelete 删除表中的数据之后 主键的自增不会归零truncate t8 可以清空数据,并且重置主键

表和表之间的关系

问题:在一张员工信息表中 有许多字段id name gender dep_name dep_desc如何优化其扩展性解决方案——拆分
外键
帮助我们建立表与表之间的关系foreign key
表的关系
1.一对多2.多对多3.一对一4.无关
ps:如何判断两张表的关系?换位思考——站在两张表的角度思考?员工表与部门表为例先站在员工表    思考一个员工能否对应多个部门(一条员工数据能否对应多条部门数据)        不能!!!        (不能直接得出结论 一定要两张表都考虑完全)再站在部门表    思考一个部门能否对应多个员工(一个部门数据能否对应多条员工数据)        能!!!得出结论    员工表与部门表示单向的一对多        所以表关系就是一对多
  • 一对多关系

foreign key1.外键字段建立在多的一方(使用的次数多)2.在创建时期 先创建被关联的表3.录入数据时期 也录入被关联的表
# 先创被关联的表create table dep(id int primary key aotu_increment,dep_name char(16),dep_desc char(32));?# 再创关联表create table emp(id int primary key aotu_increment,name char(16),gender enum(‘male‘,‘famale‘) default‘male‘,foreign key(dep_id) referrences dep(id));?# 先录入被关联的表insert into dep(dep_name,dep_desc) values(‘sb教学部‘,‘教书育人‘),(‘外交部‘,‘多人外交‘),(‘nb技术部‘,‘技术能力有限部门‘);# 再录入员工表insert into emp(name,dep_id) values(‘jason‘,2),(‘egon‘,1),(‘tank‘,1),(‘kevin‘,3);
ps:在关联了表关系之后,不可以修改被关联的数据的字段如需要修改,需要先删除被关联数据(教学部)对应的数据(教学部的员工数据)再删除部门数据。

级联更新 >>> 同步更新级联删除 >>> 同步删除

create table dep(id int primary key auto_increment,    dep_name char(16),    dep_desc char(32));create table emp(id int primary key auto_increment,    name char(16),    gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘,    dep_id int,    foreign key(dep_id) references dep(id)     on update cascade  # 同步更新   on delete cascade  # 同步删除);insert into dep(dep_name,dep_desc) values(‘sb教学部‘,‘教书育人‘),(‘外交部‘,‘多人外交‘),(‘nb技术部‘,‘技术能力有限部门‘);insert into emp(name,dep_id) values(‘jason‘,2),(‘egon‘,1),(‘tank‘,1),(‘kevin‘,3);
  • 多对多关系

# 图书和作者表create table book(id int primary key aotu_increment,title varchar(16),price int,author_id int,foreign key(author_id) references author(id)on updata cascadeon delete cascade);create table author(id int primary key auto_increment,    name varchar(32),    age int,    book_id int,    foreign key(book_id) references book(id)     on update cascade  # 同步更新   on delete cascade  # 同步删除);"""按照上述的方式创建 一个都别想成功!!!其实我们只是想记录书籍和作者的关系针对多对多字段表关系 不能在两张原有的表中创建外键需要你单独再开设一张 专门用来存储两张表数据之间的关系"""create table book(id int primary key auto_increment,    title varchar(32),    price int);create table author(id int primary key auto_increment,    name varchar(32),    age int);create table book2author(id int primary key auto_increment,    author_id int,    book_id int,    foreign key(author_id) references author(id)     on update cascade  # 同步更新   on delete cascade,  # 同步删除   foreign key(book_id) references book(id)     on update cascade  # 同步更新   on delete cascade  # 同步删除);
  • 一对一关系

"""id name age addr phone hobby email........如果一个表的字段特别多 每次查询又不是所有的字段都能用得到将表一分为二  用户表    用户表        id name age    用户详情表        id addr phone hobby email........站在用户表    一个用户能否对应多个用户详情   不能!!!站在详情表    一个详情能否属于多个用户     不能!!!结论:单向的一对多都不成立 那么这个时候两者之间的表关系    就是一对一    或者没有关系(好判断)?客户表和学生表在你们报名之前你们是客户端报名之后是学生(期间有一些客户不会报名)"""?一对一 外键字段建在任意一方都可以 但是推荐你建在查询频率比较高的表中create table authordetail(id int primary key auto_increment,    phone int,    addr varchar(64));create table author(id int primary key auto_increment,    name varchar(32),    age int,    authordetail_id int unique, # 唯一   foreign key(authordetail_id) references authordetail(id)     on update cascade  # 同步更新   on delete cascade  # 同步删除)

相关推荐