为mysql数据表创建主外键须要注意如下几点:mysql
须要创建主外键关系的两个表的存储引擎必须是InnoDB。sql
外键列和参照列必须具备类似的数据类型,便可以隐式转换的数据类型。数据库
外键列和参照列必须建立索引,若是外键列不存在索引,mysql将自动建立索引。spa
1、SQL语句建立数据表并设置主外键关系rest
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;
2、当数据表已经存在时,就要使用下面的方法创建主外键关系code
-- 为表(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);
3、删除主外键约束blog
-- 经过修改列的属性来删除自增加,第一个(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;
4、主外键关系的约束索引
若是子表试图建立一个在主表中不存在的外键值,数据库会拒绝任何insert或update操做。ci
若是主表试图update或者delete任何子表中存在或匹配的外键值,最终动做取决于外键约束定义中的on delete和on update选项。rem
on delete和on update都有下面四种动做。
cascade:主表删除或更新相应的数据行,则子表同时删除或更新与主表相匹配的行,即级联删除、更新。 set null:主表删除或更新相应的数据和,则子表同时将与主表相匹配的行的外键列置为null。当外键列被设置为not null时无效。 no action:数据库拒绝删除或更新主表。 restrict:数据库拒绝删除或更新主表。若是未指定on delete或on update的动做,则on delete或on update的默认动做就为restrict。