欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL创建数据表并建立主外键关系详解

程序员文章站 2022-05-14 17:33:03
前言 为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是innodb。 外键列和参照列必须具有相似的数据类型,即可...

前言

为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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。