您的位置:首页 > 数据库 > MySQL

外键约束

2016-07-07 21:11 549 查看
约束:

约束保证数据的完整性和一致性

约束分为表级约束和列级约束:对一个数据列建立的约束,称为列级约束;对多个数据列建立的约束,称为表级约束。列级约束既可以在列定义时声明,也可以在列定义后声明。表级约束只能列定义后声明。

约束类型包括(按功能分类):NOT NULL,PRIMARY KEY,UNIQUE KEY,DEFAULT,FOREIGN KEY

外键约束(实现一对一或一对多关系)要求:

父表与子表必须具有相同的存储引擎,而且禁用使用临时表

数据表的存储引擎必须为InnoDB

外键列与参照列必须具有相似的数据类型,其中数字的长度或有无符号位必须相同,而字符的长度可以不同。

外键列和参照列必须创建索引,如果外键列不存在索引,mysql会自动创建索引。

索引的概念:在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

查看mysql数据库引擎:



可以看到,mysql的数据库引擎为InnoDB,支持事务,行级锁,外键。

新建数据表provinces:



表中只有两个字段,自增主键id与非空字符串pname

新建数据表users:



注意外键列pid的数据类型要跟参照列的基本一样!

查看provinces数据表的索引:



表中有一个索引id,因为id是自增主键,所以会默认创建索引

查看users数据表的索引:



表中有两个索引,一个是id,创建原因同上;另一个是pid,如果外键列不存在索引,mysql会为其自动创建索引。

查看users数据表的创建语句:



仔细观察!

外键约束的操作:

CASCADE:从父表删除或更新会自动删除或更新子表中匹配的行

SET NULL:从父表删除或更新行,会设置子表中的外键列为NULL,但必须保证子表列没有指定NOT NULL

RESTRICT:拒绝对父表的删除或更新操作(如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作,这个是ANSI SQL-92标准,从mysql4.0.8开始支持)

NO ACTION:标准SQL的关键字,在mysql中与RESTRICT相同

CASCADE(新建数据表users1,外键列加入CASCADE):



往provinces与users1数据表中添加数据:



测试CASCADE:



可见,删除provinces数据表中的数据时,其子表匹配行也会被删除

实战经验:

在实际开发中其实很少用到物理的外键约束(即如上设置外键列),很多使用的是逻辑的外键约束,物理的外键约束只有InnoDB这种引擎才能支持,所以一般不定义物理外键。

逻辑外键:定义两张表结构的时候,按照存在着某种结构的方式去定义,但是不使用FOREIGN KEY 这个关键词。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  外键约束 mysql