zoukankan      html  css  js  c++  java
  • MySQL创建数据表并建立主外键关系

    为mysql数据表建立主外键需要注意以下几点:

    需要建立主外键关系的两个表的存储引擎必须是InnoDB。

    外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型。

    外键列和参照列必须创建索引,如果外键列不存在索引,mysql将自动创建索引。

    一、SQL语句创建数据表并设置主外键关系

    复制代码
    create table demo.ChineseCharInfo
    (
        ID        int     not null     auto_increment,
        Hanzi     varchar(10)     not null,
        primary key (ID)
    )
    engine=innodb auto_increment=1 default charset=utf8 collate=utf8_general_ci;
     
    create table demo.ChinesePinyinInfo
    (
        ID     int     not null     auto_increment,
        CharID     int     null,
        Pinyin varchar(10)     null,
        Tone tinyint unsigned     null,
        primary key (ID),
        
        -- 方式一:不指定外键名称,数据库自动生成
        foreign key (CharID) references ChineseCharInfo(ID) on delete cascade on update cascade 
        
        -- 方式二:指定外键名称为(FK_Name)
        -- constraint FK_Name foreign key (CharID) references ChineseCharInfo(ID) on delete cascade on update cascade 
    )
    engine=innodb auto_increment=1 default charset=utf8 collate=utf8_general_ci;
    复制代码

    二、当数据表已经存在时,就要使用下面的方法建立主外键关系

    -- 为表(demo.ChinesePinyinInfo)中字段(CharID)添加外键,并指定外键名为(FK_Name)
    alter table demo.ChinesePinyinInfo add constraint FK_Name foreign key (CharID) references ChineseCharInfo(ID);
    
    -- 为表(demo.ChinesePinyinInfo)中字段(CharID)添加外键,不指定外键名,由数据库自动生成外键名
    alter table demo.ChinesePinyinInfo add foreign key (CharID) references ChineseCharInfo(ID);

    三、删除主外键约束

    复制代码
    -- 通过修改列的属性来删除自增长,第一个(ID)为原列名,第二个(ID)为新列名
    alter table demo.ChinesePinyinInfo change ID ID int not null;
    -- 删除表(demo.ChinesePinyinInfo)中的主键约束,如果主键列为自增列,则需要先删除该列的自增长
    alter table demo.ChinesePinyinInfo drop primary key;
     
    -- 删除表(demo.ChinesePinyinInfo)中的名称为(FK_Name)的外键
    alter table demo.ChinesePinyinInfo drop foreign key FK_Name;
    复制代码

    四、主外键关系的约束

    如果子表试图创建一个在主表中不存在的外键值,数据库会拒绝任何insert或update操作。

    如果主表试图update或者delete任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的on delete和on update选项。

    on delete和on update都有下面四种动作。

    cascade:主表删除或更新相应的数据行,则子表同时删除或更新与主表相匹配的行,即级联删除、更新。
    set null:主表删除或更新相应的数据和,则子表同时将与主表相匹配的行的外键列置为null。当外键列被设置为not null时无效。
    no action:数据库拒绝删除或更新主表。
    restrict:数据库拒绝删除或更新主表。如果未指定on delete或on update的动作,则on delete或on update的默认动作就为restrict。
  • 相关阅读:
    PHP 使用命名空间(namespace),实现自动加载
    快捷方式不能使用的解决方法
    Python学习案例
    Linux下Tomcat的安装和部署
    关于Linux下的环境变量
    关于Linux下安装Oracle
    Linux下安装MySQLdb模块(Python)
    交换机VLAN的定义、意义以及划分方式
    让java程序在后台一直执行(例如putty关闭后后台程序继续运行)
    基于FTP服务器搭建yum源
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9818763.html
Copyright © 2011-2022 走看看