mysql中外键的做用和举例

(1)基本介绍数据库

外键做用: 使两张表造成关联,外键只能引用外表中的指定列的值!
创建外键的前提: 本表的列必须与外键类型相同(外键必须是外表的主键)。

指定外键关键字: foreign key(列名)

引用外键关键字: references <外键表名>(外键列名)

事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

例如:

outTable表 主键 id 类型 int

建立含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);

说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变本表中对应的列值改变。rest

(2)定义数据表

假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫作 pc;用来保存配件供货信息的表叫作 parts。

在 pc 表中有一个字段,用来描述这款电脑所使用的CPU型号;

在 parts 表中相应有一个字段,描述的正是CPU的型号,咱们能够把它想成是所有CPU的型号列表。

很显然,这个厂家生产的电脑,其使用的 cpu 必定是供货信息表(parts)中存在的型号。这时,两个表中就存在一种约束关系(constraint)—— pc 表中的 cpu 型号受到 parts 表中型号的约束。

首先咱们来建立 parts 表:

Create TABLE parts (
... 字段定义 ...,
model VARCHAR(20) NOT NULL,
... 字段定义 ...
);

接下来是 pc 表:

Create TABLE pc (
... 字段定义 ...,
cpumodel VARCHAR(20) NOT NULL,
... 字段定义 ...
};
(3)设置索引

若要设置外键,在参照表 (referencing table,即pc表) 和被参照表 (referenced table,即parts表) 中,相对应的两个字段必须都设置索引 (index),也能够设置为候选键(key),由于在不少状况下索引(index)和候选键(key)的功能等同。

对parts表:

Alter TABLE parts ADD INDEX idx_model (model);
这句话的意思是,为 parts 表增长一个索引,索引创建在 model 字段上,给这个索引发个名字叫idx_model。

对pc表也相似:

Alter TABLE pc ADD INDEX idx_cpumodel (cpumodel);

事实上这两个索引能够在建立表的时候就设置。这里只是为了突出其必要性。索引

(4)定义外键

下面为两张表之间创建前面所述的那种“约束”。由于pc的CPU型号必须参照parts表中的相应型号,因此咱们将pc表的cpumodel字段设置为“外键”(FOREIGN KEY),即这个键的参照值来自于其余表。

Alter TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model);

第一行是说要为pc表设置外键,给这个外键起一个名字叫作fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于parts表的model字段。

这样,咱们的外键就搞好了!若是咱们试着Create一台pc,它所使用的 cpu 的型号是 parts 表中不存在的,那么 MySQL 会禁止这台 PC 被 Create 出来。事件

(5)级联操做

一切看起来都挺好的,不是吗?

考虑如下这种状况:

技术人员发现,一个月以前输入到 parts 表中的某个系列的 cpu (可能有不少款)的型号全都输错了一个字母,如今须要改正。咱们但愿的是,当 parts 表中那些 Referenced Column 有所变化时,相应表中的 Referencing Column 也能自动更正。

能够在定义外键的时候,在最后加入这样的关键字:

ON Update CASCADE; 即在主表更新时,子表(们)产生连锁更新动做,彷佛有些人喜欢把这个叫“级联”操做。:)

若是把这语句完整的写出来,就是:

Alter TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON Update CASCADE;

除了 CASCADE 外,还有 RESTRICT(禁止主表变动)、SET NULL(子表相应字段设置为空)等操做ci