MySQL创建数据表并建立主外键关系详解
前言
为mysql数据表建立主外键需要注意以下几点:
- 需要建立主外键关系的两个表的存储引擎必须是InnoDB。
- 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型。
- 外键列和参照列必须创建索引,如果外键列不存在索引,mysql将自动创建索引。
一、SQL语句创建数据表并设置主外键关系
createtabledemo.ChineseCharInfo ( IDintnotnullauto_increment, Hanzivarchar(10)notnull, primarykey(ID) ) engine=innodbauto_increment=1defaultcharset=utf8collate=utf8_general_ci; createtabledemo.ChinesePinyinInfo ( IDintnotnullauto_increment, CharIDintnull, Pinyinvarchar(10)null, Tonetinyintunsignednull, primarykey(ID), --方式一:不指定外键名称,数据库自动生成 foreignkey(CharID)referencesChineseCharInfo(ID)ondeletecascadeonupdatecascade --方式二:指定外键名称为(FK_Name) --constraintFK_Nameforeignkey(CharID)referencesChineseCharInfo(ID)ondeletecascadeonupdatecascade ) engine=innodbauto_increment=1defaultcharset=utf8collate=utf8_general_ci;
二、当数据表已经存在时,就要使用下面的方法建立主外键关系
--为表(demo.ChinesePinyinInfo)中字段(CharID)添加外键,并指定外键名为(FK_Name) altertabledemo.ChinesePinyinInfoaddconstraintFK_Nameforeignkey(CharID)referencesChineseCharInfo(ID); --为表(demo.ChinesePinyinInfo)中字段(CharID)添加外键,不指定外键名,由数据库自动生成外键名 altertabledemo.ChinesePinyinInfoaddforeignkey(CharID)referencesChineseCharInfo(ID);
三、删除主外键约束
--通过修改列的属性来删除自增长,第一个(ID)为原列名,第二个(ID)为新列名 altertabledemo.ChinesePinyinInfochangeIDIDintnotnull; --删除表(demo.ChinesePinyinInfo)中的主键约束,如果主键列为自增列,则需要先删除该列的自增长 altertabledemo.ChinesePinyinInfodropprimarykey; --删除表(demo.ChinesePinyinInfo)中的名称为(FK_Name)的外键 altertabledemo.ChinesePinyinInfodropforeignkeyFK_Name;
如果子表试图创建一个在主表中不存在的外键值,数据库会拒绝任何insert或update操作。
如果主表试图update或者delete任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ondelete和onupdate选项。
ondelete和onupdate都有下面四种动作。
- cascade:主表删除或更新相应的数据行,则子表同时删除或更新与主表相匹配的行,即级联删除、更新。
- setnull:主表删除或更新相应的数据和,则子表同时将与主表相匹配的行的外键列置为null。当外键列被设置为notnull时无效。
- noaction:数据库拒绝删除或更新主表。
- restrict:数据库拒绝删除或更新主表。如果未指定ondelete或onupdate的动作,则ondelete或onupdate的默认动作就为restrict。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。