数据库新手入门之MySQL中如何定义外键

翻译|其它|编辑:郝浩|2007-09-04 10:58:20.000|阅读 807 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

定义数据表

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

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),即这个键的参照值来自于其他表。

以下为引用的内容:

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  也能自动更正。

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

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

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

以下为引用的内容:

ALTER TABLE pc ADD CONSTRAINT fk_cpu_model

            FOREIGN KEY (cpumodel)

            REFERENCES parts(model)

            ON UPDATE CASCADE;

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


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:赛迪网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP