建表关系

Posted dreamlyue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建表关系相关的知识,希望对你有一定的参考价值。

    #1. 图书与出版社 一对多关系  图书是多 出版社是一
            一个出版社能否对应多本图书 可以
            一本图书能否对应多个出版社 不可以 版权问题
            规律1:
                有一个可以就是一对多
                有两个可以就是多对多
                两个都不可以,要么没关系,要么就是一对一
            规律2:
                一对多的情况下 外键字段建在多的一方
                多对多的情况下 无需考虑 因为单独建一张表 里面放两个外键字段 分别关联两张表
                一对一的情况下 建在任何一方都可以 推荐建在查询频率比较高的那张表中
                
        建立表与表之间的硬性关系,在mysql中建立表关系统一用foreign key关键字
            1. 必须先建被关联表
            2. 插入数据的时候 应该先插被关联表的数据 这样才合理 
            3. 级联更新 级联删除
            
        auto_increment只能修饰被设置成key的字段
            key:
                unique  递增肯定不唯一 所以可以用在unique
                primary key 同上
                外键不考虑
        # 图书与出版社 
            # 多是图书为关联表 一是出版社为被关联表
            # 建表的时候先建被关联表 再建关联表
            # 插入数据的时候先插被关联表 才合理
            # 外键字段建在多的一方(外键关联的必须是另一张表的主键或唯一键)
            # 思考每张表有什么字段名
        create table publish(
            id int not null unique auto_increment,
            name varchar(32),
            addr varchar(32)
        );
        create table book(
            id int primary key auto_increment,
            title char(32),
            price char(32),
            # 创建外键字段  外键字段通常是和另一张表id字段关联 起名字尽量
            publish_id int unique,
            # 关联的必须是主键或唯一键  references后写publish_id是错误的
            foreign key(publish_id) references publish(id)  
            on update cascade  # 同步更新
            on delete cascade  # 同步删除
        );
        # 插入表数据 
        insert into publish(name,addr) values
        ('电子工业出版社','天津'),
        ('北京出版社','北京'),
        ('上海出版社','上海'),
        ('航天出版社','酒泉')
        ;
        
        # 再插关联表
        insert into book(title,price) values
        ('MySQL必知必会',67),
        ('python从入门到放弃','56'),
        ('带你玩转Linux','89')
        ;
                    mysql> select * from book;
        +----+--------------------------+-------+------------+
        | id | title                    | price | publish_id |
        +----+--------------------------+-------+------------+
        |  1 | MySQL必知必会            | 67    |       NULL |
        |  2 | python从入门到放弃       | 56    |       NULL |
        |  3 | 带你玩转Linux            | 89    |       NULL |
        +----+--------------------------+-------+------------+
                    mysql> select * from publish;
        +----+-----------------------+--------+
        | id | name                  | addr   |
        +----+-----------------------+--------+
        |  1 | 电子工业出版社        | 天津   |
        |  2 | 北京出版社            | 北京   |
        |  3 | 上海出版社            | 上海   |
        |  4 | 航天出版社            | 酒泉   |
        +----+-----------------------+--------+         
                                
                                
    #2. 图书与作者 多对多关系
            一个作者能否对应多本图书 可以
            一本图书能否对应多个作者 可以
        create table book(
            id int not null unique auto_increment,
            title varchar(32),
            price varchar(32)  # 千万不要加英文逗号
        );  
        create table author(
            id int primary key auto_increment,
            name char(32),
            age int            # 千万不要加都英文逗号
        );
        # 外键字段建在第三张表
        create table book2author(
            id int primary key auto_increment,
            book_id int,
            foreign key(book_id) references book(id)
            on update cascade
            on delete cascade,  # 千万不要少英文逗号
            author_id int,
            foreign key(author_id) references author(id)
            on update cascade
            on delete cascade
        );
        insert into book(title,price) values('傲慢与偏见',89),('围城',56);  # 1,2
        insert into author(name,age) values('简奥斯丁',28),('钱钟书',44),('歪果仁',38);  # 1,2,3
        insert into book2author(book_id,author_id) values(1,1),(1,2),(1,3),(2,1),(2,2),(2,3); # 错误
         
        #book表
        +----+-----------------+-------+    # 级联更新 级联删除的理解
        | id | title           | price |    # 删除book表不会对作者表产生影响,但会对第三张表有影响
        +----+-----------------+-------+    # 删作者表第三张表会动(因为作者表和第三张表是关联的)  book表不会动
        |  1 | 傲慢与偏见      | 89    |
        |  2 | 围城            | 56    |
        +----+-----------------+-------+
        #作者表        
        +----+--------------+------+
        | id | name         | age  |
        +----+--------------+------+
        |  1 | 简奥斯丁     |   28 |
        |  2 | 钱钟书       |   44 |
        |  3 | 歪果仁       |   38 |
        +----+--------------+------+    
        #第三张表
        +----+---------+-----------+
        | id | book_id | author_id |
        +----+---------+-----------+
        |  1 |       1 |         1 |
        |  2 |       1 |         3 |
        |  3 |       2 |         2 |
        +----+---------+-----------+
                    
    #3. 一对一
        1. 将用户表拆分成 用户表与用户详情表
        2. 客户与学生
        
        id      name    age     phone   addr    hobby   is_dog
        1       Jason   18      110     安徽  read     1
        2       tank    38      120     湛江  生蚝   1
        3       egon    85      130     山东  bb       1
        4       Jerry   28      140     云南  baby     0
        -------------------------------------------------------
        id      name    age  ┃  phone   addr    hobby   is_dog
        1       Jason   18   ┃  110     安徽  read     1
        2       tank    38   ┃  120     湛江  生蚝   1
        3       egon    85   ┃  130     山东  bb       1
        4       Jerry   28   ┃  140     云南  baby     0
        -------------------------------------------------------
        
        
        复制表
            create table xxx from select * from  tmp;  
            会创建出一张xxx表 并且表中的数据跟tmp是一模一样的
            但是没有键关系,只拷贝数据和表结构
        
        表操作
            first
            after
            change
            
        
        
        
        
        
        

    
                
                

以上是关于建表关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate多对多关系映射(建表)

EF简易教程,从建表到表间关系

完整性,模式,建表,建索引

数据库建表原则

建表关系

mysql多表之间的关系及其建表原则