MySql教程

MySQL数据库03

本文主要是介绍MySQL数据库03,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

自增特性

create table t1(
    id int primary key auto_increment,
  name varchar(32)
);


insert into t1(name) values('jason'),('kevin'),('tony');
insert into t1(name) values('oscar');  # id=4

delete from t1 where id=4;
insert into t1(name) values('oscar');  # id=5

自增不会随着数据的删除而回退!!!

delete from t1;  # 删除数据但无法重置主键
insert into t1(name) values('jason'),('kevin'),('tony');
truncate t1;  # 删除数据并重置主键值
insert into t1(name) values('jason'),('kevin'),('tony');

外键引入

'''
    创建一张员工表
      id name age dep_name dep_desc
  缺陷:
      1.表的重点不清晰(可以忽略) 
           既可以说是员工表也可以说是部门表
        2.表中某些字段对应的数据一直在重复(可以忽略)
           浪费存储空间
        3.表的扩展性极差 牵一发而动全身(不能忽略)
           耦合度太高 不利于维护
  解决:
      将一张表一分为二
    员工表                        部门表
    id    name age                id   dep_name  dep_desc
'''
'''
拆分之后,员工与部门之间没有了绑定关系;
在员工表中添加一个部门编号字段与部门表中的主键字段对应;
这个字段就是外键,因此引入了外键的概念
'''

社会中存储需要可以构建成表的数据, 它们形成的表,往往之间存储某种或某些社会关系,mysql数据库建立表结构就是社会中产生的各种数据,,分门别类管理但mysql建立的(代码层次的)表之间,,同样需要处理表与表之间的关系,形成了 多对一 、多对多 、一对一的关系。

外键字段就是用来记录表与表之间数据的关系。

外键关系

外键关系总共分为三种:一对多;多对多;一对一。

note:关系表达只能用一对多,不能用多对一。

外键关系的判断方法>>>:换位思考,即:思考两个表格数据之间的''【一对多】''的对应关系。

  • 一对多>>>:外键字段建在"多"的一方

一个员工对应一个部门,但是一个部门可以对应多个员工。

create table emp(
    id int primary key auto_increment comment '编号',
  name varchar(32) comment '姓名',
  age int comment '年龄',
  dep_id int comment '部门编号',
  foreign key(dep_id) references dep(id)
);
create table dep(
    id int primary key auto_increment comment '编号',
  dep_name varchar(32) comment '部门名称',
  dep_desc varchar(32) comment '部门描述'
);

在创建表字段的时候也可以给每个字段添加中文注释>>>:comment '中文注释'

外键关键字:

foreign key(dep_id) references dep(id)

foreign key的约束效果:

  1. 创建表的时候,应该先创建被关联表(没有外键字段的表)
  2. 插入数据的时候,应该先插入被关联表(没有外键字段的表);外键字段填入的值只能是被关联表中已经存在的值
  3. 修改、删除被关联表数据都会出现障碍(是不被允许的)

级联更新和级联删除:

要想打破这种约束效果,实现表数据之间的联动,需要使用级联更新和级联删除方法。

create table emp1(
    id int primary key auto_increment comment '编号',
  name varchar(32) comment '姓名',
  age int comment '年龄',
  dep_id int comment '部门编号',
  foreign key(dep_id) references dep1(id) 
  on update cascade  # 级联更新
  on delete cascade  # 级联删除
);
create table dep1(
    id int primary key auto_increment comment '编号',
  dep_name varchar(32) comment '部门名称',
  dep_desc varchar(32) comment '部门描述'
);

ps:

在实际工作环境中,外键也可能不会使用,因为外键会消耗额外的资源,并且会增加表的复杂度;
表很多的情况下,我们也可以通过SQL语句的形式建立逻辑意义上的表关系。

  • 多对多>>>:外键字段重新建立一个存储表关系的表格数据

create table book(
    id int primary key auto_increment,
    title varchar(32),
    price float(10,2)
);
create table author(
    id int primary key auto_increment,
    name varchar(32),
    gender enum('male','female','others')
);
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  # 级联删除
);

ps:

两张基表内的数据没有在第三张表内绑定关系的情况下,是可以随意进行增、改、删等操作的。

  • 一对一>>>:外键字段建在任意一方都可以,但是推荐建在查询频率较高的较好的基表那一方

create table User(
  id int primary key auto_increment,
  name varchar(32),
  gender enum('male','female','others'),
  user_detail_id int unique,  # 好好体会为什么加unique
  foreign key(user_detail_id) references UserDetail(id) 
  on update cascade   # 级联更新
  on delete cascade,  # 级联删除
);
create table UserDetail(
  id int primary key auto_increment,
  phone bigint,
  age int
);

 

这篇关于MySQL数据库03的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!