Heim >Datenbank >MySQL-Tutorial >新手学习MySQL外键所要知道的知识

新手学习MySQL外键所要知道的知识

WBOY
WBOYOriginal
2016-06-07 16:09:311437Durchsuche

我们今天是要和大家一起讨论的是新手学习MySQL外键所要知道的知识,我前两天在相关网站看见新手学习MySQL外键所要知道的相关知识的资料,觉得挺好,今天拿就出来供大家分享。 本文详细介绍MySQL外键:数据库新手入门之MySQL中如何定义外键 定义数据表 假如某

我们今天是要和大家一起讨论的是新手学习MySQL外键所要知道的知识,我前两天在相关网站看见新手学习MySQL外键所要知道的相关知识的资料,觉得挺好,今天拿就出来供大家分享。

本文详细介绍MySQL外键:数据库新手入门之MySQL中如何定义外键

定义数据表

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

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

在Parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。

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

首先我们来创建 parts 表:

<ol class="dp-xml">
<li class="alt"><span><span>CREATE TABLE parts (  </span></span></li>
<li><span>... 字段定义 ...,  </span></li>
<li class="alt"><span>model VARCHAR(20) NOT NULL,  </span></li>
<li><span>... 字段定义 ...  </span></li>
<li class="alt"><span>);  </span></li>
<li><span>接下来是Pc表:  </span></li>
<li class="alt"><span>CREATE TABLE pc (  </span></li>
<li><span>... 字段定义 ...,  </span></li>
<li class="alt"><span>cpumodel VARCHAR(20) NOT NULL,  </span></li>
<li><span>... 字段定义 ...  </span></li>
<li class="alt"><span>};  </span></li>
</ol>

设置索引

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

对Parts表:

<ol class="dp-xml"><li class="alt"><span><span>ALTER TABLE parts ADD INDEX idx_model (model); </span></span></li></ol>

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

对Pc表也类似:

<ol class="dp-xml"><li class="alt"><span><span>ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel); </span></span></li></ol>

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

定义外键

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

<ol class="dp-xml">
<li class="alt"><span><span>ALTER TABLE pc ADD CONSTRAINT fk_cpu_model  </span></span></li>
<li><span>FOREIGN KEY (cpumodel)  </span></li>
<li class="alt"><span>REFERENCES parts(model); </span></li>
</ol>

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

这样,我们的外键就可以了。如果我们试着CREATE一台Pc,它所使用的CPU的型号是Parts表中不存在的,那么MySQL会禁止这台PC被CREATE出来。

级联操作

考虑以下这种情况:

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

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

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

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

<ol class="dp-xml">
<li class="alt"><span><span>ALTER TABLE pc ADD CONSTRAINT fk_cpu_model  </span></span></li>
<li><span>FOREIGN KEY (cpumodel)  </span></li>
<li class="alt"><span>REFERENCES parts(model)  </span></li>
<li><span>ON UPDATE CASCADE; </span></li>
</ol>

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

延伸阅读

外键(Foreign Key)

如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

外键的作用:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn