新手入门:如何在MySQL数据库中定义外键_MySQL
定义数据表
如果计算机制造商将整机和配件的产品信息保存在其数据库中。用于保存整机产品信息的表称为整机产品信息pc;用于保存零件供应信息的表称为parts。
PC表中有一个字段,用于描述该计算机使用的CPU型号;
Parts表中有一个字段,描述的是CPU的型号,我们可以把它看作是所有CPU的型号列表。
显然,该厂家生产的电脑,其CPU必须是供货信息表(parts)中存在的型号。此时,两个表中存在约束关系。(constraint)——pc表中的CPU型号受到parts表中型号的约束。
,我们将创建parts表
CREATETABLEparts(...字段定义...,modelVARCHAR(20)NOTNULL,...字段定义...);接下来是PC表
CREATETABLEpc(...字段定义...,cpumodelVARCHAR(20)NOTNULL,...字段定义...};设置索引
如需设置外键,请在参考表中(referencingtable,即pc表)和参考表(referencedtable,在parts表中,相应的两个字段必须设置索引(index)。
对parts表
ALTERTABLEpartsADDINDEXidx_model(model);这句话的意思是为parts表添加一个索引,索引是基于model字段,给索引起一个名字叫做idx_model。
PC表也类似:
ALTERTABLEpcADDINDEXidx_cpumodel(cpumodel);事实上,这两个索引可以在创建表时设置。这只是为了突出它的必要性。
定义外键
以下是两张表之间建立的上述“约束”。因为PC的。CPU型号必须参照parts表中的相应型号,我们将pc表的cpumodel字段设置为“外键”(FOREIGNKEY),也就是说,这个键的参考值来自其他表。
ALTERTABLEpcADDCONSTRAINTfk_cpu_modelFOREIGNKEY(cpumodel)REFERENCESparts(model);第一行是为pc表设置外键,给这个外键起一个名字叫做fk_cpu_model;第二行是将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于parts表的model字段。
这样,我们的外键就好了!假如我们试着CREATE一台pc,它使用的CPU型号不存在于Parts表中,所以MySQL将禁止这个PC被Parts表中,CREATE出来。
级联操作
考虑以下情况
技术人员发现,一个月前输入到parts表中的某一系列cpu(可能有很多型号)都输错了字母,现在需要纠正。我们减肥人网希望的是,当parts表中的那些时候,ReferencedColumn当相应表中发生变化时,ReferencingColumn也可以自动更正。
在定义外键时,可以在添加这样的关键字
ONUPDATECASCADE;也就是说,当主表更新时,子表(人)会产生连锁更新动作,似乎有些人喜欢称之为“级联”操作。
如果完整地写出这句话,就是
ALTERTABLEpcADDCONSTRAINTfk_cpu_modelFOREIGNKEY(cpumodel)REFERENCESparts(model)ONUPDATECASCADE;除了CASCADE,还有RESTRICT(禁止主表变更)、SETNULL(子表相应字段设置为空)等操作。