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
关于对该文补充:
如果需要在主表删除记录时,当子表有对应记录则不允许删除,就加上 ON delete restrict 。完整案例如下:
两个表,国家和城市,城市中的country_id是外键。
Create table country(
country_id smallint unsigned not null auto_increment,
country varchar(50) not null,
last_update timestamp not null,
primary key(country_id)
)engine=innoDB default charset=utf8;
Create table city(
city_id smallint unsigned not null auto_increment,
city varchar(50) not null,
country_id smallint unsigned not null,
last_update timestamp not null default current_timestamp on update curren_timestamp,
Primary key(city_id),
key idx_fk_country_id (country_id),
constraint fk_city_country Foreign Key(country_id) References country(country_id) on DELETE restrict ON update cascade
)engine=innoDB default charset=utf8;
删除外键:
删除外键定义
—————
定义外键的时候articles.member_id外键比articles.category_id子句多了一个CONSTRAINT fk_member ?
这个fk_member就是用来删除外键定义用的,如下所示:
mysql> ALTER TABLE articles DROP FOREIGN KEY fk_member;
Query OK, 1 row affected (0.25 sec)
Records: 1 Duplicates: 0 Warnings: 0
这样articles.member_id外键定义就被删除了,但是如果定义时没有指定CONSTRAINT fk_symbol (即外键符号)时该怎么删除呢?别急,没有指定时,MySQL会自己创建一个,可以通过以下命令查看:
mysql> SHOW CREATE TABLE articles;
+———-+————————————+
| Table | Create Table |
+———-+————————————+
| articles | CREATE TABLE `articles` (
`article_id` int(11) unsigned NOT NULL auto_increment,
`category_id` tinyint(3) unsigned NOT NULL,
`member_id` int(11) unsigned NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`article_id`),
KEY `category_id` (`category_id`),
KEY `member_id` (`member_id`),
CONSTRAINT `articles_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+———-+————————————+
1 row in set (0.01 sec)
可以看出articles.category_id的外键符号为articles_ibfk_1,因为就可以执行以下命令删除外键定义:
mysql> ALTER TABLE articles DROP FOREIGN KEY articles_ibfk_1;
Query OK, 1 row affected (0.66 sec)
Records: 1 Duplicates: 0 Warnings: 0
6. 总结
——-
引入外键的缺点是会使速度和性能下降,当然外键所带来的优点还有很多。
转载于:https://www.cnblogs.com/yigerendehaibian/archive/2012/11/07/2759210.html
MySQL中如何定义外键[转]相关推荐
- 在mysql中如何添加外键约束_如何在MySQL中设置外键约束
(1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库 ...
- MySQL中如何设置外键
下面我将以举例的方式说明,作者能力有限,欢迎指正和补充.也欢迎和我交流探讨~ 一.环境 Windows操作系统,MySQL 5.7 二.使用工具 Navicat 三.前提知识 1.什么是主键 Prim ...
- mysql中怎样插入外键_MySQL 添加外键
MySQL 添加外键 MySQL 添加外键 DROP TABLE IF EXISTS `nation`; CREATE TABLE `nation`( `pii_Nation` smallint(2) ...
- mysql和sql定义外键约束_SQL外键约束的含义及创建
建立外键约束可以对sql语句的增删改有约束作用. 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键 ...
- mysql中什么叫外键_数据库中外键是什么?
什么是外键? 外键 ( foreign key ) 是用于建立和加强两个表数据之间的链接的一列或多列.通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接.这个列就成为第二个表的外 ...
- mysql定义外键_MySQL定义外键的方法
MySQL定义外键的方法是每个学习MySQL的人都需要掌握的知识,下文就对MySQL定义外键的语句写法进行了详细的阐述,供您参考. 外键为MySQL带来了诸多的好处,下面就为您介绍MySQL定义外键的 ...
- mysql表定义外键语法_mysql设置外键的语法怎么写?
2012-08-31 回答 mysql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加er图的可读性 有些人认为外键 ...
- mysql查询某张表的所有外键_oracle中查询所有外键引用到某张表的记录
欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 oracle中查询所有外键引用到某张表的记录 //查询表的主键约束名 select * from user_constr ...
- MySQL为表添加外键约束
为表添加外键约束的语法 Alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段名): 为表student ...
最新文章
- Failed to install .apk on device 'emulator-5554': timeout解决方法
- drill apache_如何使用Apache Drill分析高度动态的数据集
- vscode写java没有提示_VS Code报错Language Support for Java(TM)插件显示需要JDK11 写java代码没有提示...
- PyTorch 1.0 中文文档:数据类型信息
- Spring : @Component注解
- 2015.8.3 Java
- 苹果 iPhone/iPad 第三方键盘为何没语音听写功能?真相了
- 理解iOS 8中的Self Sizing Cells和Dynamic Type
- mac如何清空Recent Places
- ubuntu+i3wm桌面
- 如何给绘制好的CAD图纸设置密码?
- 基于微信小程序的竞赛管理系统
- JAVA后台判断是否重复(编辑)
- android广播 拦截短信,短信接口防刷信息推荐「多图」
- 淡墨写韵,不守起承转合
- 帆软 大屏BI模板(含报表滚动,图表联动等)下载
- MySQL数据库(三)-表行的语句使用
- 第5章.网站首页高可用nginx+lua
- 【JavaWeb】JavaWeb概述
- php实现bigpipe