zoukankan      html  css  js  c++  java
  • 表之间的关系

    表之间的关系

    一、字段的操作

    create table test(
        id int primary key auto_increment,
        name char(10) unique,
        age int unsigned default 0
    );
    
    # 修改字段类型
    alter table 表名 modify 字段名 字段类型[长度] 约束条件;
    alter table test modify name varchar(16) unique; 
    
    # 修改字段名
    alter table 表名 change 旧字段名 新字段名 字段类型[长度] 约束条件;
    alter table test change name new_name varchar(18) unique;
    
    # 默认在表字段最后增加字段
    alter table 表名 add 新字段名 字段类型[长度] 约束条件;  # 末尾
    alter table test add sex enum('男', '女') default '男';
    
    # 在所有字段之前添加
    alter table 表名 add 新字段名 字段类型[长度] 约束条件 first; # 首位
    alter table test add height float(7, 2) default 0 first;
    
    # 在某个字段之后添加字段
    alter table 表名 add 新字段名 字段类型[长度] 约束条件 after 字段名;# 某字段之后
    alter table test add weight float(7, 2) default 0 after height;
    
    # 删除字段
    alter table 表名 drop 字段名;
    alter table test drop height;
    

    二、多表之间的关系

    """
    一对一:丈夫-妻子,用户-身份证,作者-作者详情
    一对多:部门-员工,班级-学生,书-出版社
    多对多:老师-班级,课程-学生,出版社-作者
    """
    # 书 - 出版社 - 作者 - 作者详情 外键分布
    # 外键是 建立表与表关联 的字段,通常 一个表的外键 是 另一个表的主键(唯一键也可以)
    
    # 一对一:**外键在任何一方都可以,此时外键要设置 唯一键**
    """
    作者(author):id,name,sex,age,mobile
    作者详情(author_detail): id,info,address,author_id
    ----------------------------------------------------
    作者(author):id,name,sex,age,mobile, detail_id
    1 Tom 1
    2 Bom 2
    3 Bob 3
    
    作者详情(author_detail): id,info,address
    1 Tom_info
    2 Bom_info
    """
    
    # 一对多:**外键必须放在多的一方,此时外键值不唯一**
    """
    书(book):id,name,price,publish_id
    1 西游记 1
    2 东游记 2
    3 西厢记 1
    4 流浪记 1
    
    出版社(publish): id,name,address,phone
    1 老奶奶出版社
    2 小奶奶出版社
    """
    
    # 多对多:**一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一**
    """
    作者(author):id, name, age
    出版社(publish):id, name, address
    作者与出版社关系表:id, author_id, publish_id
    id		author_id		publish_id
    1			1				1
    2			1				2
    3			2				1
    4			2				2
    """
    

    三、外键

    # 作者(author):id,name,sex,age,mobile, detail_id
    # 作者详情(author_detail): id,info,address
    
    # 1、外键的 字段名 可以自定义(名字随意),通常命名规范(关联表_关联字段)
    
    # 2、外键要通过 foreign key 语法建立表与表之间的关联
    
    # 3、foreign key(所在表的外键字段) references 关联表(关联字段)
    # eg:foreign key(detail_id) references author_detail(id)
    
    # 4、级联关系
    #	级联更新 on update cascade
    # 	级联删除 on delete cascade
    
    # 重点:外键字段本身可以唯一或不唯一,但是外键关联的字段一定唯一
    

    四、一对一无级联关系

    
    # 不是级联关系
    # 作者详情(author_detail): id,info,address
    create table author_detail(
        id int primary key auto_increment,
        info varchar(255),
        address varchar(255)
    	);
    # 作者表id,name,sex,age,mobile, detail_id
    # 被关联表的必须先要创建
    create table author(
    	id int primary key auto_increment,
        name varchar(18) unique not null,
        sex enum('男','女') default '男',
        age int default 0,
        mobile char(18) unique not null,
        detail_id int unique not null,
        foreign key(detail_id) references author_detail(id)
    	);
    	
    # 插入数据必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
    mysql>: insert into author(name, mobile,detail_id) values('tom',"123456", 1); # 报错 ERROR 1452 (23000):
    mysql>: insert into author_detail(info, address) values('tom_info', 'tom_address');
    
    mysql>: insert into author(name, mobile,detail_id) values('tom',"123456", 1);
    
    mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
    
    mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
    
    
    # 修改关联表 author
    mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
    
    mysql>: update author set detail_id=3 where detail_id=2; # 没有被其他数据关联的数据可以修改
    mysql>: update author set detail_id=3 where detail_id=1; # 报错
    
    # 删除关联表 author 
    mysql>: delete from author where detail_id=3; # 可以删除,关联的表
    
    # 修改被关联表 author_detail
    mysql>: update author_detail set id=10 where id=1;  # 无法修改, 
    mysql>: update author_detail set id=10 where id=2;  # 可以修改
    
    # 删除被关联表 author_detail
    mysql>: delete from author_detail where id=1; # 不可以删除
    
    """
    没有级联的关系下:
    增加:先增加被关联表记录(author_detail),在增加关联表记录(author)
    删除:先删除关联表记录,在删除被关联表记录
    修改:关联与被关联表都无法完成,关联的外键和主键 数据更新-(如果被关联表记录没有被绑定,可以被修改)
    
    """
    
    mysql> desc author_detail;
    +---------+--------------+------+-----+---------+----------------+
    | Field   | Type         | Null | Key | Default | Extra          |
    +---------+--------------+------+-----+---------+----------------+
    | id      | int(11)      | NO   | PRI | NULL    | auto_increment |
    | info    | varchar(255) | YES  |     | NULL    |                |
    | address | varchar(255) | YES  |     | NULL    |                |
    +---------+--------------+------+-----+---------+----------------+
    3 rows in set (0.01 sec)
    
    mysql> desc author;
    +-----------+-------------+------+-----+---------+----------------+
    | Field     | Type        | Null | Key | Default | Extra          |
    +-----------+-------------+------+-----+---------+----------------+
    | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name      | varchar(18) | NO   | UNI | NULL    |                |
    | sex       | enum('      | YES  |     |         |                |
    | age       | int(11)     | YES  |     | 0       |                |
    | mobile    | char(18)    | NO   | UNI | NULL    |                |
    | detail_id | int(11)     | NO   | UNI | NULL    |                |
    +-----------+-------------+------+-----+---------+----------------+
    6 rows in set, 2 warnings (0.01 sec)
    

    五、一对一有级联关系

    # 作者详情(author_detail): id,info,address
    create table author_detail(
    	id int primary key auto_increment,
        info varchar(256),
        address varchar(256)
    );
    # 作者表id,name,sex,age,mobile, detail_id
    create table author(
    	id int primary key auto_increment,
        name varchar(18) unique not null,
        sex enum('男','女') default '男',
        age int default 0,
        mobile char(18) unique not null,
        detail_id int unique not null,
        foreign key(detail_id) references author_detail(id) on update cascade on delete cascade
    	);
    	
    # 增加数据(必须先对被关联表添加数据,有关联表外键,关联的记录后,关联表才可以创建数据)
    mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);  # 错误
    mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');
    mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);
    
    mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
    mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
    
    # 修改关联表 author 
    mysql>: update author set detail_id=3 where detail_id=2;  # 失败,3详情不存在
    mysql>: update author set detail_id=1 where detail_id=2;  # 失败,1详情已被关联
    
    mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
    mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改 
    
    # 删除关联表
    mysql>: delete from author where detail_id=3;  # 直接删除
    
    
    # 修改被关联表 author_detail 
    mysql>: update author_detail set id=10 where id=1;  # 级联修改,同步关系关联表外键
    
    # 删除被关联表 author_detail
    mysql>: delete from author where detail_id=10;  # 可以删除对被关联表无影响
    
    mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 10);
    mysql>: delete from author_detail where id=10;  # 可以删除,将关联表的记录级联删除掉
    
    
    """
    增加:必须要先对关联表插入信息,才可以对被关联表插入信息
    修改:修改关联表 author的外键,必须是在author_detail主键没有被关联才可以被修改
    	修改被关联表 author_detail主键,author外键也会随之改变
    删除:
    	关联表author删除,不会影响到被关联表信息
    	删除被关联表author_detail,关联表author信息也会被随之删除
    """
    

    六、表一对多关系

    # 一对多:外键必须放在多的一方,此时外键值不唯一
    # 出版社-书------>一对多的关系
    # 出版社(publish): id,name,address,phone
    create table publish(
    	id int primary key auto_increment,
        name varchar(10),
        address varchar(255),
        phone char(10)
    );
    # 书(book):id,name,price,publish_id, author_id
    create table book(
    	id int primary key auto_increment,
        name varchar(20) not null,
        price decimal(5, 2) default 0,
        publish_id int, # 一对多的外键不能设置唯一
        foreign key(publish_id) references publish(id) on update cascade on delete cascade
    );
    
    # 增加:增加被关联的表publish的数据, 在增加关联表book数据
    mysql>: insert into publish(name, address, phone) values
    ('人民出版社', '北京', '010-110'),
    ('西交大出版社', '西安', '010-119'),
    ('老男孩出版社', '上海', '010-120');
    
    mysql>: insert into book(name, price, publish_id) values
    ('xi', 6.66, 1),
    ('dong', 8.66, 1),
    ('python', 2.66, 7),
    ('java', 3.66, 8),
    ('c', 88.88, 9);
    # 没有被关联的字段,插入依旧错误
    mysql>: insert into book(name, price, publish_id) values ('打脸之道', 0.3, 4);  # 失败
    
    
    # 更新:直接更新被关联表的(publish) 主键,关联表(book) 外键 会级联更新
    mysql>: update publish set id=10 where id=1;
    
    # 更新:直接更新关联表的(book) 外键,修改的值对应被关联表(publish) 主键 如果存在,可以更新成功,不存在反之失败
    mysql>: update book set publish_id=2 where id=4;  # 成功
    mysql>: update book set publish_id=1 where id=4;  # 失败
    
    # 删除 
    # 删被关联表,关联表会被级联删除
    mysql>: delete from publish where id = 2;
    
    #	删关联表,被关联表不会发生变化
    mysql>: delete from book where publish_id = 3;
    
    """
    增加:必须先publish关联表,插入数据,然后被关联表在插入数据
    更新:修改关联表 book的外键,必须是在publish主键没有被关联才可以被修改
    	修改被关联表 publish主键 book中外键也会随之改变
    删除:
    	关联表publish删除,被关联表也会被删除
    	删除被关联表book,关联表author信息也会被随之删除
    """
    
    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    mysql show的常见用法
    【转】在ubuntu下完美安装RTX(解决离线、乱码问题)(图片无法显示)
    bcdedit 替代easybcd 编辑grub
    Ruby学习札记(二)[数组]
    Ruby学习札记(一)常用数据
    [分布式]分布式锁
    移动docker数据文件到nas共享盘、释放C盘空间
    [分布式]分布式限流
    [分布式]分布式会话session、spring-session
    学习强国挑战答题学习资料
  • 原文地址:https://www.cnblogs.com/randysun/p/11581314.html
Copyright © 2011-2022 走看看