• MySQL 外键 一对一 一对多 多对多 复制


    # 外键
    
    ## 1,学习外键首先要明白表与表之间的关系
    
    ​                首先要换位思考 在考虑了这边 还要考虑另一边
    
    ​                然后在下定论
    
    ###     判断表关系的语法
    
    ####             图书与出版社
    
    ​                一本书可不可以有多个出版社 不可以
    
    ​                一个出版社可不可以出版多本书  可以
    
    ​                这就是一对多关系 
    
    ####             图书与作者
    
    ​                一本书可不可以有多个作者   可以
    
    ​                一个作者可不可以写多本书   可以
    
    ​                多对多的关系
    
    ###             作者与作者信息
    
    ​            一个作者可不可以有多个个人信息 不可以 
    
    ​            一个作者的个人信息能不能有多个作者  不可以
    
    ​            要么两个是一对一,要么没关系
    
    primary key 主键约束,该约束的意思就是,该字段的值非空且不能重复
    
    关键字 references 建立表与表之间的关系
    
    foreign key 外键约束,意思就是该字段与另外一张表有联系.好比儿子必定有爸爸,要是有人想把爸爸K掉,儿子就肯定不干了!反之没儿子的人如果要被K,就没人管啦
    
    ## 2,一对多
    #foreign key会带来什么效果
    1,在创建表的时候,先创建 被关联的表不带有foreign key
    
    ​    创建完在创建带有foreign key 
    
    ```python
    create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
    );
    
    create table emp(
    id int primary key auto_increment,
    name char(15),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key (dep_id) references dep(id) 给这个dep_ip传入的id必须是
        另一个表的id 而 referencnces 就是链接起另一张表 dep 里面一般都放的是令一张表的主键 且在给dep_id 传值的时候必须是另一张表有的id 如果没有就报错
    on update cascade
    on delete cascade
    );
    
    insert into dep (dep_name,dep_comment) values
    ('教学部','辅导学生,教授python'),
    ('外交','中国形象大屎'),
    ('技术部门','技术能力有限部门');
    
    insert into emp (name,gender,dep_id) values
    ('jason','male',1),
    ('egon','male',2),
    ('taken','female',3);
    
    
    ```
    
    
    
    
    
    
    
    ## 3,多对多
    
    ```python
    # 图书表与作者表之间的关系
    """
    仍然站在两张表的角度:
    1.站在图书表:一本书可不可以有多个作者,可以!那就是书多对一作者
    2.站在作者表:一个作者可不可以写多本书,可以!那就是作者多对一书
    双方都能一条数据对应对方多条记录,这种关系就是多对多!
    """
    # 先来想如何创建表?图书表需要有一个外键关联作者,作者也需要有一个外键字段关联图书。问题来了,先创建谁都不合适!如何解决?
    # 建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id
    create table author (
    id int primary key auto_increment,
    name char(10));
    
    create table book(
    id int primary key auto_increment,
    bname char(10),
    price int);
    insert into author (name) values
    ('egon'),
    ('jason'),
    ('yangxin'),
    ('alex');
    
    insert into book (bname,price) values
    ('php从入门到消失',1000),
    ('葵花宝典',553),
    ('小泽玛利亚大战苍井空',200009),
    ('小泽精选',20000),
    ('小仓精选',2222);
    
    create table author2book(
    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 author(id)
    on update cascade
    on delete cascade);
    
    insert into author2book(author_id,book_id) values
    (1,2),
    (2,3),
    (3,4),
    (1,4),
    (4,2);
    
    ```
    
    
    
    ## 4,一对一
    
    
    
    用户名 和用户信息
    
    ​    
    
    ```python
    左边的表记录唯一对应右边的一条记录,反之也一样
    create table username(
        id int primary key auto_increment,
        name char(10) not null,
        age int not null);
    insert into username(name,age) values
    ('jason',98),
    ('yangxin',18),
    ('wukai',10);
    
    create table card(
        id int primary key auto_increment,
        identity int unique,#该字段唯一
        username_id int unique,#该字段唯一
        foreign key (card_id) references username(id)
        on delete cascade
        on update cascade);
    insert into card(identity,username_id) values
    ('170020',1),
    ('125435',2),
    ('146547',3);
    ```
    
    ## 5修改表
    
    ```python
    # mysql对大小写不敏感!!!
    语法:
    1. 修改表名                
            ALTER TABLE 表名
                        RENAME 新表名;
    2. 增加字段      
            ALTER TABLE 表名
                       ADD 字段名  数据类型 [完整性约束条件…],                               ADD 字段名  数据类型 [完整性约束条件…];
             ALTER TABLE 表名
                        ADD 字段名  数据类型 [完整性约束条件…]  FIRST;            ALTER TABLE 表名
                    ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;  3. 删除字段      
             ALTER TABLE 表名 
                    DROP 字段名;
     4. 修改字段  # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!      
                ALTER TABLE 表名                           
                        MODIFY  字段名 数据类型 [完整性约束条件…];     
                ALTER TABLE 表名 
                         CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];      ALTER TABLE 表名                          
                    CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
    ```
    
    ## 6复制表
    
    ​    
    
    ```python
    #复制表 语法 create table 表名 select *from 被复制的表名
    #只能复制表的结构+记录 不会复制 主键 外键 和索引
    ```
  • 相关阅读:
    我的ORM之六-- 批量
    我的ORM之五-- 事务
    我的ORM之四--删除
    我的ORM之三 -- 更新
    我的ORM之二--添加
    我的ORM之一 -- 查询
    hmailserver
    jquery 插件原则
    C#中 ToString 和 override ToString 的区别
    linq操作符:元素操作符
  • 原文地址:https://www.cnblogs.com/yangxinpython/p/11383986.html
Copyright © 2020-2023  润新知