InnoDB外键使用小结
USE `wfc_database`;
# 主表(也可以称作:被参照表、referenced table、outTable)
ALTER TABLE `app` ENGINE=INNODB;
# 从表(也可以称作:参照表、外表、referencing table )
ALTER TABLE `app_version` ENGINE=INNODB;
# 一个 【应用 】可以有多个【应用版本】
# 因此 app 和 app_version 是 1:n 的关系 (一个 app_id 对应有多个 av_app_id)
# app_id是 app表 的主键, av_app_id是 app_version表 的索引 # app_version数据订正(在 app_version表中删除 app已经没有的 app_id)
DELETE FROM `app_version` WHERE av_app_id NOT IN ( SELECT app_id FROM app);
# 此步骤极为重要,否则无法添加外键(从表中存在主表中没有的外键id是不允许的) # app_version添加外键
ALTER TABLE `app_version`
ADD CONSTRAINT fk_av_app_id
FOREIGN KEY (av_app_id)
REFERENCES `app` (app_id)
ON DELETE CASCADE ON UPDATE CASCADE; # 建立外键的前提:
被约束字段与外键的数据类型必须相同
被约束字段需要设置为索引,外键需要设置为 PRIMARY
外键作用: 使两张表形成关联,外键只能引用从表中的列的值!
指定从表关键字: foreign key (列名)
引用外键关键字: references <外键表名> (外键列名)
# 事件触发(级联操作)限制 : on delete 和 on update
可设参数 cascade (跟随外键改动) ,强烈推荐,能够保存数据一致性
restrict (限制主表中的外键改动)
[默认] no action # 如果以上语句在创建过程中有报如下错误
Can not create table 'd91.#sql-197e_18b4' (errno: 150)
# 请把 av_app_id 和 app_id 的字段类型设置为完全相同
也就是约束字段的 类型、长度、有无符号、是否为空、默认值 要设置跟外键相同
对于这次的场景,我把 app_id 和 av_app_id 都设置为 INT(10) , UNSIGNED,NOT NULL
确保外键的名字没有和已经存在的 键值/索引名 重名 # 补充,如果要删除外键约束可以这么做
alter table 表名 drop foreign key 外键约束名称;
# 比如,要删掉刚刚创建的外键,你可以
ALTER TABLE `app_version` DROP FOREIGN KEY fk_av_app_id ; # --------------------- InnoDB外键知识 ------------------------- # 方法一:
定义数据表
假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做 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,
... 字段定义 ...
};
设置索引
若要设置MySQL外键,在 参照表 [外表] (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表设置MySQL外键,给这个外键起一个名字叫做fk_cpu_model;第二行是说将本表的cpumodel字段设置为外键;第三行是说这个外键受到的约束来自于Parts表的model字段。 这样,我们的外键就可以了。如果我们试着CREATE一台Pc,它所使用的CPU的型号是Parts表中不存在的,那么MySQL会禁止这台PC被CREATE出来。 级联操作
考虑以下这种情况:
技术人员发现,一个月之前输入到 parts 表中的某个系列的 cpu (可能有很多款)的型号全都输错了一个字母,现在需要改正。我们希望的是,当 parts 表中那些 Referenced Column 有所变化时,相应表中的 Referencing Column 也能自动更正。
可以在定义MySQL外键的时候,在最后加入这样的关键字:
ON UPDATE CASCADE; 即在主表更新时,子表(们)产生连锁更新动作,似乎有些人喜欢把这个叫“级联”操作。:)
如果把这语句完整的写出来,就是:
# 例子一
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)
ON UPDATE CASCADE; 除了 CASCADE 外,还有 RESTRICT(禁止主表变更)、SET NULL(子表相应字段设置为空)等操作。
延伸阅读 外键(Foreign Key)
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。 外键的作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值! 方法二:
建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。
外键作用: 使两张表形成关联,外键只能引用外表中的列的值!
指定主键关键字: foreign key(列名)
引用外键关键字: references <外键表名>(外键列名)
事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action 例如:
outTable表 主键 id 类型 int
创建含有外键的表: create table temp(
id int,
name char(20),
foreign key(id) references outTable(id)
on delete cascade on update cascade); 创建后修改表:
alter table temp add constraint foreign key(id) references outTable(id) on delete cascade on update cascade; 说明:把id列设为外键,参照外表outTable的id列,当外键的值删除本表中对应的列删除;当外键的值改变本表中对应的列值改变。在使用alter中constraint是针对使用外键的情况。
这种主外键的级联操作在mysql中只支持InnoDB类型。要设置为该类型要在mysql中的配置文件中改动默认不支持InnoDB为支持,可输入命令查看是否支持: mysql > show variables like "have%";
如果不支持停止mysql,打开my.ini配置文件找到skip-innodb,前面加#,重启mysql,然后修改主外键两表类型: mysql > alter table xxx ENGINE = InnoDB;
最后在命令中输入上述创建外键的方法。 不过,如果你的业务不需要使用到事务,那么使用myisam是最佳考虑, 因为myisam不支持事务,有比较好的性能。 但是如果你的业务必须要使用到事务,也就是说对数据一致性要求很高的话,需要使用到INODB,由于INODB要使用到锁,因此它的并发能力就差一些,因此性能方面也会差一些。 如果要删除外键约束可使用如下命令:
mysql > alter table ss_accesscode drop foreign key 外键约束名称; 注:添加外键约束时若没有指定外键约束的名称,则系统会自动添加外键约束名:表名_ibfk_n(表示第n个外键约束)。比如我们创建外键时就省略了外键线束名称。
InnoDB外键使用小结的更多相关文章
- mysql索引和外键
innodb外键: 1.CASCADE:从父表删除或更新会自动删除或更新子表中匹配的行 2.SET NULL:从父表删除或更新行,会设置子表中的外键列为NULL,但必须保证子表列没有指定NOT NUL ...
- 只有innoDB才允许使用外键
1.只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎. 2.注意: 1.必须使用InnoDB引擎: 2.外键必须建立索引(INDEX): 3.外键绑定关系这里使用了“ O ...
- MySQL中MyISAM与InnoDB区别及选择,mysql添加外键
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- [TimLinux] MySQL InnoDB的外键约束不支持set default引用选项
1. 外键 MySQL的MyISAM是不支持外键的,InnoDB支持外键,外键是MySQL中的三大约束中的一类:主键约束(PRIMARY KEY),唯一性约束(UNIQUE),外键约束(FOREIGN ...
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- [原创]MYSQL中利用外键实现级联删除和更新
MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...
- MySQL外键约束
mysql的五种约束 1.PRIMARY KEY 2.UNIQUE KEY 3.NOT NULL 4.DEFAULT 5.FOREIGN KEY 其中外键约束的使用用法 CREATE TABLE te ...
- mysql外键添加error1215
在mysql创建表外键的过程中,由于操作不当,会提示cannot add foreign key constraint的错误. 造成此错误可能的原因如下: 1.数据类型不匹配,外键与其相关联的键必须数 ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
随机推荐
- SQL Server2008创建约束图解 转
转自 http://www.cnblogs.com/longhs/p/3670307.html SQLServer 中有五种约束, Primary Key 约束. Foreign Key 约束. Un ...
- Leetcode 9. Palindrome Number(判断回文数字)
Determine whether an integer is a palindrome. Do this without extra space.(不要使用额外的空间) Some hints: Co ...
- kafka集群安装与配置
一.集群安装 1. Kafka下载: 可以从kafka官方网站(http://kafka.apache.org)上找到下载地址,再wgetwget http://mirrors.cnnic.cn/ap ...
- ios中Raw文件系统常用文件夹
1.[/Applications] 常用软件的安装目录 2.[/Applications/Preferences.app/zh_CN.lproj] 软件Preferences.app的中文汉化文件存放 ...
- jQuery 笔记
1. 选择器 http://www.runoob.com/jquery/jquery-selectors.html 2. toggle() 用来切换 hide() 和 show() 方法 ht ...
- Cocos2d-x中Vector<T>容器以及实例介绍
Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T ...
- Cocos2d-x加速度计实例:运动的小球
下面我们通过一个实例介绍一下如果通过层加速度计事件实现访问加速度计.该实例场景如下图所示,场景中有一个小球,当我们把移动设备水平放置,屏幕向上,然后左右晃动移动设备来改变小球的位置. 下面我们再看看具 ...
- asp.net中的Application概述
全局应用程序类 从Application这个单词上大致可以看出Application状态是整个应用程序全局的.在ASP时代我们通常会在Application中存储一些公共数据,而ASP.NET中App ...
- oracle表分区心得
由于系统是对前批次系统进行改造,需要对表建立分区 1.已建立未分区的表,无法进行任何表分区的操作,如:增加.删除.合并.拆分均无法操作 2.已分区的表至少保留1个分区,即不能全删 3.若有defaul ...
- win7下64位系统memcache/memcached安装教程
折腾了1个多小时,终于搞定.操作系统时64位的,php5.3.13 类似于上一篇的xdebug安装教程~~ memcache和memcached的区别 在自己的新程序中打算全面应用memcached ...