MySQL外键:数据库新手入门之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(子表相应字段设置为空)等操作。

时间: 2024-10-29 08:31:55

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

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

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

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

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

MySQL中如何定义外键

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

MySQL新手入门教程:mysql优化入门

MySQL是目前常用的RDBMS(RelationalDatabaseManagementSystem/关系数据库管理系统),还有其他如PostgreSQL,Oracle,DB2等关系数据库管理系统.而数据库性能的重要性无需强调,在这里简单说一下,安装MySQL之后的优化相关的话题. 计算MySQL使用内存 首先确认一下,计算MySQL进程占用内存的方法. MySQL占用内存 = 全局缓存  + ( 线程缓存 x 最大连接数 ) 全局缓存的占用内存,用以下方法计算. max_heap_table

新手入门:Java中变量和常量的基本语法

变量|语法 1.变量: 定义:相信对于它的定义应该不用在说了,大家应该已经熟悉又熟悉了. 例如: a,a1,name等都是合法的变量. 说明: 1)Java要求在使用一个变量之前要对变量的类型加以声明. 2)Java中一个变量的声明就是一条完整的Java语句,所以应该在结尾使用分号. 3)变量的命名规则: 变量必须以一个字母开头. 变量名是由一系列字母或数位的任意组合. 在Java中字母表示Unicode中相当于一个字母的任何字符. 数位也包含0-9以外的其他地位与一个数位相当的任何Unicod

新手入门:JSP中“预定义变量”的使用

js|变量 为了简化JSP表达式和scriptlets中的代码,提供了8种自动定义的变量,有时称做implicit objects(固有对象).它们是:request,response,out,session,application,config,pageContext,和 page.下面我们来详细的了解它们. request 与request相联系的是HttpServletRequest类,使您可以得到request的参数(通过getParameter方法),request 的类型(GET,P

mysql配置远程访问数据库

问题描述 mysql配置远程访问数据库 请教大神mysql该怎么配置才能够让别的计算机连到服务器的mysql?我在服务器搞了一个小时不是1130就是1045错误,百度了,但是很无奈.mysql.user表改过了,没用.grant权限也试过.网上还有一种说法,root账户不能远程访问,不知道是不是?但是我们公司mysql的root账户可以.求解 解决方案 To answer your question, on Windows, the my.cnf file may be called my.in

sql server-急!!!请教关于MySQL 与SQLserver2008R2数据库问题!

问题描述 急!!!请教关于MySQL 与SQLserver2008R2数据库问题! 现在有MySQL的 .sql文件,如何做才能使它导入SQL server2008R2中,并且不会报错. 解决方案 如果是建表的sql,问题不大,你可以手工把建表的sql修改下,然后运行,然后将mysql的数据导出成csv,再导入sql server 解决方案二: 直接执行那个sql文件就行了,,

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

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