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

定义数据表

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

时间: 2025-01-02 18:08:12

数据库新手入门之MySQL中如何定义外键的相关文章

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

定义数据表 假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息.用来保存整机产品信息的表叫做 Pc:用来保存配件供货信息的表叫做Parts. 在Pc表中有一个字段,用来描述这款电脑所使用的CPU型号: 在Parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表. 很显然,这个厂家生产的电脑,其使用的CPU一定是供货信息表(parts)中存在的型号.这时,两个表中就存在一种约束关系(constraint)--Pc表中的CPU型号受到Parts 表中型号

MySQL中如何定义外键

假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息.用来保存整机产品信息的表叫做pc:用来保存配件供货信息的表叫做parts. 在pc表中有一个字段,用来描述这款电脑所使用的CPU型号:在parts表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表. 很显然,这个厂家生产的电脑,其使用的CPU一定是供货信息表(parts)中存在的型号.这时,两个表中就存在一种约束关系(constraint)--pc表中的CPU型号受到parts表中型号的约束. 首先我们来

mybatis中外键查询,外键表中又有外键

问题描述 mybatis中外键查询,外键表中又有外键 mybatis中,一张表有两个外键,怎么查另外两张表的内容?而这两张表又有外键(一张表一个,一张表两个),该怎么查 ? 解决方案 <association property="cp" javaType="CpTO"> <id column="CP_ID" property="id"/> <result column="CNAME&qu

学习入门:在MySQL中定义外键

和所有开源项目的参考文档一样,MySQL文档中的SQL语法说明让我等初学者看起来头大.这不,今天我花了大半天的工夫,才把在MySQL中设置外键的语法弄明白,所以赶紧写下来,一来加深一下印象,二来万一过两天忘了,自己也好回来查一下. 定义数据表 假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息.用来保存整机产品信息的表叫做 pc:用来保存配件供货信息的表叫做 parts. 在 pc 表中有一个字段,用来描述这款电脑所使用的CPU型号: 在 parts 表中相应有一个字段,描述的正是CPU

mysql-请教数据库大神,MySQL中的point类型数据取出来之后如何转化为字符串在后台使用?

问题描述 请教数据库大神,MySQL中的point类型数据取出来之后如何转化为字符串在后台使用? 请教数据库大神,MySQL中的point类型数据取出来之后如何转化为字符串在后台使用?我想通过这个得到的坐标去计算两个坐标之间的距离,但是取出来后没法转化成字符串,大神们,帮帮忙,谢谢了! 解决方案 select AsText(point) from T;

外键查询-在java web中,有外键的servlet要怎么实现!

问题描述 在java web中,有外键的servlet要怎么实现! 在java web中,有外键的servlet要实现增删改查该怎么写?求一个简单的例子,急急急!!!!! 解决方案 http://blog.csdn.net/jspamd/article/details/11579447 解决方案二: http://bbs.csdn.net/topics/390194015

link环境下codefirst定义外键,是不是还需要定义集合来接受呢?

问题描述 link环境下codefirst定义外键,是不是还需要定义集合来接受呢? link环境下codefirst定义外键,是不是还需要定义集合来接受呢? 解决方案 http://bbs.csdn.net/topics/390898496http://www.cnblogs.com/jes_shaw/archive/2013/03/06/2946061.html

link中如何通过外键查询查找不同类型的实体类?如何用泛型实现

问题描述 link中如何通过外键查询查找不同类型的实体类?如何用泛型实现 link中如何通过外键查询查找不同类型的实体类?如何用泛型实现 解决方案 http://zhidao.baidu.com/link?url=dAywmn5-CBLpCvxlXSzoSnUqMt8C-7JZHkmdnKZAUUsbxppa3QhGa6FtR9TyizmaFFt4wntYQt-O59scCUSew_

一张表两个主键 在另外一张表中怎么用外键引用它?

问题描述 一张表两个主键 在另外一张表中怎么用外键引用它? 一张表两个主键 在另外一张表中怎么用外键引用它? 麻烦帮忙解决一下. 非常感谢. 解决方案 首先申明一点,一张表没有两个主键,你说的那种情况属于联合主键.对于你说的这种情况,直接将这个联合主键的两个字段添加到另一张表中作为外键就可以. 解决方案二: Create table BorrowBook( StuNo int, BookID int, BorrowDate datetime, ReturnDate datetime, CONST