请选择 进入手机版 | 继续访问电脑版
贠老师培训群:150322713    贠老师QQ:767708506

贠老师office培训-excel学习网

 找回密码
 立即注册
点击咨询贠老师
查看: 233|回复: 10

[mysql] MySQL中如何定义外键

[复制链接]

607

主题

604

帖子

1909

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1909
发表于 2016-2-23 21:40:03 | 显示全部楼层 |阅读模式

定义数据表

假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做 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(子表相应字段设置为空)等操作。


想要了解更多更全面的web前段知识,css样式,html教程,数据库教程,word教程,excel教程等等,就到excel学习网www.excelxue.com


回复

使用道具 举报

2

主题

1214

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2016-3-29 09:54:58 | 显示全部楼层
希望楼主能够收集更多的资料,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

1159

帖子

6

积分

注册会员

Rank: 2

积分
6
发表于 2016-4-17 15:43:21 | 显示全部楼层
顶顶
回复 支持 反对

使用道具 举报

2

主题

1214

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2016-4-17 21:45:20 | 显示全部楼层
一下子解决了我工作当中的难题,谢谢楼主,非常感谢!
回复 支持 反对

使用道具 举报

0

主题

1155

帖子

10

积分

注册会员

Rank: 2

积分
10
发表于 2016-4-18 14:25:39 | 显示全部楼层
还有许多问题不明白,有点恼火啊!
回复 支持 反对

使用道具 举报

1

主题

1153

帖子

5

积分

注册会员

Rank: 2

积分
5
发表于 2016-4-20 10:57:32 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

1

主题

1161

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2016-4-20 21:36:08 | 显示全部楼层
很不错的帖子,又学到了,力挺
回复 支持 反对

使用道具 举报

2

主题

1315

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 2017-8-17 13:52:53 | 显示全部楼层
楼主是好人哪,感谢分享,太棒了!
回复 支持 反对

使用道具 举报

5

主题

764

帖子

73

积分

注册会员

Rank: 2

积分
73
发表于 2018-12-29 09:48:18 | 显示全部楼层
楼主不错
回复 支持 反对

使用道具 举报

1

主题

1153

帖子

5

积分

注册会员

Rank: 2

积分
5
发表于 2019-6-16 09:47:15 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



陕ICP备15003731号  

贠老师培训 GMT+8, 2019-7-18 12:55 , Processed in 0.240941 second(s), 32 queries .

快速回复 返回顶部 返回列表