mysql之浅谈主外键
主键(PRIMARY KEY)
主键在一个数据表中只能有唯一的一个,约束当前字段的值不能重复,且非空保证数据的完整性,也可以当做当前数据表的标识符用来查询(当做索引,唯一性索引的一种)
创建带主键的表
/*带主键*/
CREATE TABLE T(
id int(11) not null primary key,
name char(20) );
/*带复合主键*/
CREATE TABLE T(
id int(11) not null ,
name char(20) not null,
primary key(id,name) );
/*主键递增*/
CREATE TABLE T(
id int(11) primary key not null auto_increment ,
name char(20) not null, );
/*给已有表添加主键*/
alter table t add primary key(id);
外键(FORGEIGN KEY)
外键起的作用就是让你在数据库帮助的情况下更合理的添加数据的正确度。、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作。保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!可以使得两张表关联,保证数据的一致性和实现一些级联操作;
(转)
//
1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
2,用外键要适当,不能过分追求
3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。
需要注意的是:MySQL允许使用外键,但是为了完整性检验的目的,在除了InnoDB表类型之外的所有表类型中都忽略了这个功能。这可能有些怪异,实际上却非常正常:对于数据库的所有外键的每次插入、更新和删除后,进行完整性检查是一个耗费时间和资源的过程,它可能影响性能,特别是当处理复杂的或者是缠绕的连接树时。因而,用户可以在表的基础上,选择适合于特定需求的最好结合。所以,如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型
一般数据库属于持久层,尽量把业务逻辑转移到应用层,外键会使表之间耦合太大,所以建议靠程序去检测和数据库的事务来保证数据的完整性和一致性;另外外键需要额外的资源进行数据完整性和一致性检验,更容易造成死锁,数据库更容易达到瓶颈,特别是表的扩展能力大大受限。
当然也要看你的系统,如银行系统等需要很高的安全性和可靠性还是建议使用外键,另外利用外键检测数据还能减少程序开发量;但是大部分web项目都是追求体验、性能,对数据并不是非常严格,还是不建议使用;
innoDB 是目前mysql中唯一支持外键的内置存储引擎。使用外键是需要成本的,比如外键通常都要求每次在修改数据时都要在另一张表中多执行一次查询操作。虽然innoDB强制外键使用索引,但还是无法消除这种约束检查的开销。如果外键列的选择性很低,则会导致一个非常大的且选择性很低的索引。
不过在某些场景下,外键回提升一些性能。如果想要确保两个相关的表始终有一致的数据,那么使用外键要比应用程序中检查一致性的性能要高的多,此外,外键在相关数据的更新和删除上,要比应用中维护要更高效,不过,外键维护操作是逐步进行的,所以这样的更新要比批量的更新和删除要慢一些
外键约束会需要一些额外的锁。容易导致死锁。而且这类死锁问题很难排查。
外键会带来很大的额外消耗。对性能有很大的影响。
/*能够在创建表的时候创建,也能够在创建表之后创建。
创建表时创建:*/
create table student
(id int primary key,
name char(4),
dept char(9)
sex char(4)) create table grade
(id int ,
grade int
constraint id_fk foreign key (id) references student (id)
) /*或创建了两表之后再建*/
alter table grade
add constraint id_fk foreign key (id) references student (id)
mysql之浅谈主外键的更多相关文章
- MySQL的数据类型,MySQL增删改--添加主外键、添加属性、删除主外键、改表名、获取系统当前时间等
ls /etc/rc.d/init.d/mysql56service mysql56 start ps aux |grep "mysql"|grep "socket=&q ...
- MySQL创建数据表并建立主外键关系
为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引, ...
- MySql不支持主外键
创建表不支持主外键,能够添加外键成功,但是无法外键约束.查资料发现MySql的默认ENGINE 为MyISAM ,不支持外键,需要修改为 INNODB 修改前: Create Table CREAT ...
- MySQL 主外键约束与标准SQL不同的地方
[标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent; create table if not exists parent( i ...
- Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...
- MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等
MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化… 这是一个漫长且考 ...
- netcore2.0 ORM框架中如何配置自定义的主外键加载
环境:netcore2.0 DB :mysql ORM:Ant https://github.com/yuzd/AntData.ORM/tree/netcore2 [给我一个star吧] NUGET: ...
- MySQL删除所有表的外键约束、禁用外键约束
转: MySQL删除所有表的外键约束.禁用外键约束 2017年10月27日 00:11:34 李阿飞 阅读数:4512 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- oracle主从表主外键对应关系
一.首先让我们来了解下什么是主外键? 1.主键:唯一标识数据表中的某一行 1) 一个表中只能有一个主键.如果在其他字段上建立主键,则原来的主键就会取消.在ACCESS中,虽然主键不是必需的,但最好为每 ...
随机推荐
- 1006 Sign In and Sign Out (25 分)
At the beginning of every day, the first person who signs in the computer room will unlock the door, ...
- 配置一个mariadb数据库《二》
mariadb 配置一个数据库 案例4:配置一个数据库 4.1 问题 本例要求在虚拟机 ...
- 搭建DVWA Web渗透测试靶场
文章更新于:2020-04-13 按照惯例,需要的文件附上链接放在文首. 文件名:DVWA-1.9-2020.zip 文件大小:1.3 M 文件说明:这个是新版 v1.9 (其实是 v1.10开发版) ...
- C语言atoi函数
目录 1.包含头文件 2.函数声明 3.功能说明 4.示例 5.其它说明 6.版权声明 C语言提供了一系列函数把字符串转换为整数:atoi.atol.atoll和atoq. 1.包含头文件 #incl ...
- bootstraptable 必备知识点
1.如何动态刷新表中数据? (1).无参刷新: $("#table").bootstrapTable('refresh'); (2).带参刷新: var opt = { url: ...
- Linux不同时钟的区别
今天发现项目中调用 clock_gettime 函数传入时钟类型参数时有 CLOCK_MONOTONIC.CLOCK_MONOTONIC_RAW.CLOCK_BOOTTIME.CLOCK_REALTI ...
- python3(二十二) oop
""" 面向对象编程 """ __author__ = 'shaozhiqi' # 面向对象的程序设计把计算机程序视为一组对象的集合,而每个 ...
- [一起面试AI]NO.9 如何判断函数凸或非凸
首先定义凸集,如果x,y属于某个集合M,并且所有的θx+(1-θ)f(y)也属于M,那么M为一个凸集.如果函数f的定义域是凸集,并且满足 f(θx+(1-θ)y)≤θf(x)+(1-θ)f(y) 则该 ...
- Docker php安装扩展步骤详解
前言 此篇,主要是演示docker-php-source , docker-php-ext-install ,docker-php-enable-docker-configure 这四个命令到底是用来 ...
- Map使用foreach遍历方式,Map获取第一个键值
List<Map<String, Object>> mapList = new ArrayList<>(); for (Map.Entry<String,O ...