mysql数据库外键的知识是本文的主要内容。接下来,我们将通过一个具体的例子来一步步介绍这些设置。如果是电脑厂商,它的数据库里保存着整机和配件的产品信息。用来保存整机产品信息的表叫PC;用来存储配件供应信息的表称为parts。
pc表中有一个字段描述这台计算机使用的CPU型号;零件表中有相应的字段,描述CPU的型号。我们可以把它看作是所有CPU型号的列表。很明显,这个厂家生产的电脑的CPU一定是零件清单上的型号。这时,两个表中有一个约束& mdash& mdashpc表中的CPU型号受零件表中的型号限制。
首先,让我们创建零件表:
创建表格部件(...字段定义...,模型VARCHAR(20)不为空,...字段定义...);
接下来是PC表:
创建电脑(...字段定义...,cpumodel VARCHAR(20)不为空,...字段定义...};
设置索引
要设置外键,在引用表(pc表)和被引用表(零件表)中,相应的两个字段必须设置索引。
在零件表上:
ALTER TABLE parts添加索引idx_model(模型);
这句话的意思是,给parts表添加一个索引,索引建立在model字段上,给这个索引起个名字叫idx_model。
pc表是类似的:
ALTER TABLE PC ADD INDEX idx _ cpumodel(cpumodel);
事实上,这两个索引可以在创建表时设置。这只是为了突出它的必要性。
定义外键
在下面两个表之间建立上表。约束”。因为pc的cpumodel必须引用parts表中对应的型号,所以我们将pc表的CPU model字段设置为“外键”(Foreign key),即该键的引用值来自其他表。
ALTER TABLE PC ADD CONSTRAINT fk _ CPU _ model外键(cpumodel)引用parts(model);
第一行说给pc表设置一个外键,给这个外键起个名字叫FK _ CPU _ Model;第二行涉及将该表的cpumodel字段设置为外键;第三行说明这个外键上的约束来自部件表的模型字段。
这样,我们的外键就准备好了!如果我们试图创建一台pc,而它使用的CPU的型号在parts表中不存在,MySQL将禁止创建这台PC。
级联操作
考虑以下情况:
技术人员发现一个月前在零件表中输入的某系列CPU的型号(可能有很多型号)都输入了错误的字母,现在需要更正。我们希望当零件表中的引用列发生变化时,相应表中的引用列也能自动更正。
定义外键时,可以在末尾添加以下关键字:ON UPDATE CASCADE也就是说,当主表被更新时,子表(子表)产生一个连锁更新动作。似乎有人喜欢把这叫做”。级联”操作。
如果这个语句写完整了,就是:
ALTER TABLE pc ADD约束fk_cpu_model外键(cpumodel)引用更新级联上的部件(模型);
除了CASCADE,还有RESTRICT(禁止主表更改)和SET NULL。
补充说明:
如果需要删除主表中的记录,当子表有对应的记录时,不允许删除,增加了ON delete restrict。完整的案例如下:
两个表,country和city,city中的country_id是外键。
Createtablecountry( country_idsmallintunsignednotnullauto_increment, countryvarchar(50)notnull, last_updatetimestampnotnull, primarykey(country_id) )engine=innoDBdefaultcharset=utf8; Createtablecity( city_idsmallintunsignednotnullauto_increment, cityvarchar(50)notnull, country_idsmallintunsignednotnull, last_updatetimestampnotnulldefaultcurrent_timestamponupdatecurren_timestamp, Primarykey(city_id), keyidx_fk_country_id(country_id), constraintfk_city_countryForeignKey(country_id)Referencescountry(country_id)onDELETErestrictONupdatecascade )engine=innoDBdefaultcharset=utf8;删除外键
删除外键定义
定义外键时,articles.member_id外键比articles.category_id子句多一个约束fk_member?
这个fk_member用于删除外键定义,如下所示:
mysql>ALTERTABLEarticlesDROPFOREIGNKEYfk_member; QueryOK,1rowaffected(0.25sec) Records:1Duplicates:0Warnings:0这样就删除了articles.member_id的外键定义,但是如果定义中没有指定约束fk_symbol(即外键符号)如何删除?不用担心,如果没有指定,MySQL会自己创建一个,可以通过下面的命令查看:
mysql>SHOWCREATETABLEarticles; +———-+—————————&md关键词:MySQL,数据库
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227168.html