如何在 MySQL 数据库中定义外键

本文给出 了 MySQL 数据库中 定义外键的必要性 、具体的定 义步骤和相关 的一些基本操 作 ,

供大家参 考!

定义数 据表

假如某个 电脑生产商 ,它的数据 库中保存着 整机和配 件的产品信 息。用来保存 整机产品信息 的表叫做 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,

... 字段定义 ...

};

设置索 引

若要设置 外键,在参照 表 (referencing table ,即 pc 表 ) 和被参 照表 (referenced table ,即 parts 表 ) 中,相对 应的两个字段 必须都设置索 引 (index) 。

对 parts 表:

-----------------------------------------------------Page 1-----------------------------------------------------

ALTER TABLE parts ADD INDEX idx_model (model);

这句话 的意思是, 为 parts 表增加 一个索引, 索引建立在 model 字段上 ,给这个索 引起个名 字叫 idx_model 。

对 pc 表也类似 :

ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

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

定义外 键

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

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 出来。

级联操 作

考虑以下 这种情况:

技 术人 员发 现, 一个 月之 前输 入到 parts 表 中的 某个 系列 的 cpu ( 可能 有很 多款 )的 型号 全 都输错了 一个字母,现在需要 改正 。我们希望 的是 ,当 parts 表中那些 Referenced Column 有 所变化时 ,相应表中的 Referencing Column 也能自动 更正。

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

-----------------------------------------------------Page 2-----------------------------------------------------

ON UPDATE CASCADE;

即在主表 更新时,子表 (们)产生连 锁更新动作, 似乎有些人喜 欢把这个叫 “ 级联 ” 操作。

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

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

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

-----------------------------------------------------Page 3-----------------------------------------------------