金沙棋牌app手机下载

当前位置:金沙棋牌 > 金沙棋牌app手机下载 > MySQL创建数据表并建立主外键关系,简单谈一谈

MySQL创建数据表并建立主外键关系,简单谈一谈

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-22 11:09

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

今天学完了最后一个mysql字段约束外键,做一下总结:

本文我们主要介绍一些MySQL数据库外键约束的知识,接下来就让我们一起来了解一下吧。

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

一、外键约束和要求

1.父表和子表必须使用相同的存储引擎,而且禁止使用临时表;
2.数据表的存储引擎只能为InnoDB
3.外键列和参照列必须有相似的数据类型。其中数字的长度或是否有符号位必须相同;而且字符的长度则可以不同;
4.外键列和参照列必须创建索引。如果外键列不存在索引的话,mysql将自动创建索引

 

*物理外键和逻辑外键
只有InnoDB才支持物理外键,平时的设计中是很少定义物理外键约束的,而是按照表与表之间的逻辑关系来定义逻辑外键,不设置物理外键

金沙棋牌app手机下载,外键约束须满足以下条件:

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

二、外键约束的参照操作

1.CASCADE:从父表中删除或者更新且自动删除或更新子表中匹配的行

    • 删除:删除主表时自动删除从表。删除从表,主表不变
    • 更新:更新主表时自动更新从表。更新从表,主表不变    

2.SET NULL:从父表删除或更新行,并设置了子表中的外键列为NULL,如果使用该选项,必须保证子表列没有指定NOT NULL

    • 删除:删除主表时自动更新从表值为NULL。删除从表,主表不变
    • 更新:更新主表时自动更新从表值为NULL。更新从表,主表不变    

3.RESTRICT:拒绝对父表的删除或更新操作

4.NO ACTION:标准SQL的关键字,在mysql中与RESTRICT相同

NULL、RESTRICT、NO ACTION

删除:从表记录不存在时,主表才可以删除。删除从表,主表不变

更新:从表记录不存在时,主表才可以更新。更新从表,主表不变

 

三、创建外键命令

明确指定外键的名称:alter table book add constraint FK_BOOK foreign key(pubid) references pub_com(id) on delete restrict(CASCADE,SET NULL) on update restrict(CASCADE,SET NULL) ;

父子表都为innodb,不是临时表。

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

在子表上,必须存在一个索引,外键列是索引列的全部或部分,但必须是开头部分,并且顺序一致; 从mysql4.1.2开始,如果不存在索引,会自动创建外键上的索引; 加速约束检查/避免全表扫描。

 

在父表上,必须存在一个索引,被参照键是索引列的全部或部分,但必须是开头部分,并且顺序一致; 加速约束检查/避免全表扫描。

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

不允许在外键前缀或后缀上索引; 外键不能包括text/blob列。

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;

如果指定约束标识符symbol, 那么必须数据库范围唯一; 不指定时,系统会自动产生。

 

父子表的相应列必须有相似的内部数据类型, 以便进行比较时不必进和类型转换。

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

对于数字类型,类型长度与符号必须相同。

-- 为表(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);

对于字符类型, 长度不必相同。

 

如果创建一个on delete set null或on update set null约束,子表的列必须不能为not null。

三、删除主外键约束

从mysql3.23.50开始,如果外键或候选键(被引用键)列上有null值,mysql 将不进行check。

-- 通过修改列的属性来删除自增长,第一个(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。

四、主外键关系的约束

外键约束对父表的含义:

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

在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句, InnoDB支持5种方式, 分列如下:

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

cascade方式

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

在父表上update/delete记录时,同步update/delete掉子表的匹配记录;

cascade:主表删除或更新相应的数据行,则子表同时删除或更新与主表相匹配的行,即级联删除、更新。
set null:主表删除或更新相应的数据和,则子表同时将与主表相匹配的行的外键列置为null。当外键列被设置为not null时无效。
no action:数据库拒绝删除或更新主表。
restrict:数据库拒绝删除或更新主表。如果未指定on delete或on update的动作,则on delete或on update的默认动作就为restrict。

On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用。

 

set null方式

在父表上update/delete记录时,将子表上匹配记录的列设为null;

要注意子表的外键列不能为not null;

On delete set null从mysql3.23.50开始可用; on update set null从mysql4.0.8开始可用。

No action方式

如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作;

这个是ANSI SQL-92标准,从mysql4.0.8开始支持。

Restrict方式

同no action, 都是立即检查外键约束;

Set default方式

解析器认识这个action,但Innodb不能识别。

注意:trigger不会受外键cascade行为的影,,即不会解发trigger。

关于MySQL数据库外键约束的知识就介绍到这里了,希望本次的介绍能够给您带来一些收获,谢谢!

MySQL数据库 的 外键约束 的知识,接下来就让我们一起来了解一下吧。 外键约束须满足以下条件: 父子表都为innodb...

本文由金沙棋牌发布于金沙棋牌app手机下载,转载请注明出处:MySQL创建数据表并建立主外键关系,简单谈一谈

关键词:

上一篇:没有了

下一篇:没有了