美文网首页
MySQL约束

MySQL约束

作者: 指间Hrc | 来源:发表于2018-10-18 15:06 被阅读46次

    概念:

    为了保证数据的完整性和一致性,MySQL提供了约束这个属性。约束分为表级约束和列级约束,如果约束只是针对某一个字段来说,则称之为列级约束,如果针对两个或者两个以上的,则称之为表级约束。列级约束既可以在列定义时声明,也可以在列定义后声明,而表级约束只能在列定义后声明。

    约束类型包括以下几种:

    NOT NULL (非空约束)

    PRIMARY KEY (主键约束)

    UNIQUE KEY (唯一约束)

    DEFAULT (默认约束)

    FOREIGN KEY (外键约束)

    场景:

    在操作数据表时,为了避免插入重复的数据,可以在字段后面添加 AUTO_INCREMENT(自动编号) 属性来保证记录的唯一性,并且该字段必须为整型或者字符型,若使用字符型,小数必须为 0 。

    该属性如下特点:

    ⑴ 赋予自动编号属性的字段必须定义为主键

    ⑵ 在默认情况下,起始值为1,每次递增加1

    案例:

    创建一张 tb_test2 数据表,并且给 id 字段赋予 AUTO_INCREMENT 属性,系统报错,根据信息可以看出,字段 id 必须设置为主键。接下来我们来了解一下主键约束和其他约束。(非空约束在上一文结尾已提及)

    1、主键约束 (PRIMARY KEY)

    特点:

    ⑴ 每张数据表只能存在一个主键

    ⑵ 主键可以保证记录的唯一性

    ⑶ 主键自动默认为 NOT NULL

    案例:

    以刚才创建的表为例,重新创建数据表,在 id 后添加 PRIMARY KEY 属性表示该字段为主键。

    接着查看数据表的结构:

    可以发现,字段 id 不为 NULL 符合 AUTO_INCREMENT 属性特点,key 的值为 PRI,说明该字段为主键,而 username 在创建时已经指定为 NOT NULL 。当我们依次插入数据时,对应的id 会自动增长。

    案例:(数据表的记录操作会在后续的文章提及)

    依次插入三条记录,并查看所有记录,数据表的 id 自动递增。

    注: AUTO_INCREMENT 必须和 PRIMARY KEY 一起使用,而 PRIMARY KEY 不一定和

    AUTO_INCREMENT 一起使用。

    案例:

    当我们创建数据表并没有给主键 id 赋予 AUTO_INCREMENT 时,系统提示创建成功,此时的 id 不能为空,查询表结构可以看出 Extra 字段没有 auto_increment 属性。我们插入一些记录来验证一下:

    在插入记录时,分别对 id 和 username 字段进行赋值,但是不允许插入两条相同的记录:

    当我们插入相同 id 的记录时,系统报错,提示表已存在该记录。

    在一张数据表中,除了主键约束外,为了保证记录的唯一性,MySQL 提供了另一种约束,

    就是唯一约束。

    2、唯一约束 (UNIQUE KEY)

    特点:

    ⑴ 唯一约束可以保证记录的唯一性

    ⑵ 唯一约束的字段可以为空值(NULL)

    ⑶ 每张数据表可以存在多个唯一约束

    当然了,对于指定唯一约束的字段来说,如果插入的多条记录都为空,表里也只存在一条空记录,保证唯一性。

    案例:

    创建表 tb_test4 ,字段 id 为主键且自动增长,username 为字符型且唯一约束。

    我们插入记录验证一下:

    插入一条记录提示成功。

    重新插入一条相同的记录,系统报错,不能重复添加,说明 username 被赋予唯一约束,只能插入一条记录。

    3、默认约束 (DEFAULT)

    特点:

    当插入记录时,如果没有明确为字段赋值,系统自动赋予默认值

    案例:

    创建数据表 tb_test5 并查看表结构,其中,sex 字段含有三个值,分别对应男、女、保密三种性别,且默认值为 3 。

    插入一条只给 username 赋值的记录时 ,查询记录,可以发现,字段 sex 的记录值为 3 ,也就是默认值。

    4、外键约束(FOREIGN KEY)

    特点:

    ⑴ 保持数据一致性,完整性 

    ⑵ 实现一对一或一对多关系

    要求:

    ⑴ 父表(字表所参照的表)和子表(具有外键列的表)必须使用相同的存储引擎,而且禁止使用临时表。

    ⑵ 数据表的数据引擎只能为 InnoDB。

    ⑶ 外键列和参照列必须具有相同的数据类型。其中数字的长度或是否有符号位必须相同;

    而字符的长度则可以不同。

    ⑷ 外键列和参照列必须创建索引。如果不存在索引的话,MySQL将自动创建索引。

    我们通过以上要求要创建表并赋予外键约束。

    案例:

    首先查看数据库的默认存储引擎:

    由返回结果看出,MySQL默认存储引擎为 InnoDB 。

    现在我们创建两张表,并对指定的字段赋予相同的数据类型:

    创建一张省份表并查看该表的引擎:

    由图可以看出,存储引擎是 InnoDB 满足要求。

    再创建一张用户表,含有用户id,用户名username ,和用户所在省份的外键 pid ,此时创建失败,因为外键 pid 的数据类型和父表中的 id 数据类型不一致导致无法创建,同样,如果外键 pid 是否有符号与父表的主键 id 不一致,也是无法创建成功的。

    其中,约束外键的语法结构为:

    FOREIGN KEY (外键 id)REFERENCES 父表名称 (父表所参照的 id)。

    由图可以得出,外键 pid 满足数据类型和是否有符号和父表主键 id 一致,所以该表创建成功。注:外键列(pid)和参照列(id)必须创建索引。

    我们来看看两张表是否有创建索引:

    由图可以看出,数据表 tb_province 的参照列 id 已经创建了主键索引。

    而对于数据表 tb_users ,可以发现存在两个索引,一个是主键索引 id,另一个 pid 系统已经自动创建了索引。

    通过查看所该表的创建命令,可以看出系统给 pid 自动创建了索引( KEY 'pid'),同时在

    CONSTRAINT 'tb_users_ibfk_1' FOREIGN KEY ('pid')  可以得出 pid 为外键约束。

    在我们创建外键约束的时候,可以添加一些外键约束的参照操作,有如下几种:

    ⑴ CASCADE:父表删除或更新行时,同时自动更新或更新子表匹配的行

    ⑵ SET NULL:从父表删除或更新行,并设置子表中的外键列为 NULL 。如果使用该选项,必须保证子表列没有指定 NOT NULL

    ⑶ RESTRICT:拒绝对父表的删除或更新操作

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

    在更新表的时候,可以通过以上选项来设置子表是否进行相应的操作。

    案例:

    我们创建一张 tb_users1 数据表,给 pid 设置为外键约束,同时在删除的时候,设置 CASCADE 选项。

    接下来通过插入信息来验证一下。由于子表(tb_users1)参照父表(tb_province),为了保证子表有参照数据,必须先在父表里插入记录。

    对父表(tb_province)依次插入三条记录,并查询所有记录。

    对子表(tb_user1)依次插入三条记录,并查询所有数据。

    现在两张表都存在记录,我们先通过删除记录来验证一下,CASCADE 选项。

    首先删除父表(tb_province)中 id 为 2 的记录:

    查询 tb_province 所有记录:

    可以看出,原先记录 id = 2 已经被删除了。

    我们再来查询一下子表中 pid = 3 的记录是否还存在:

    由图可以得知,pid = 2 的所有记录已经被删除了。

    这就是 CASCADE 所起的作用,父表删除记录同时删除子表所相关的记录,同理更新的操作也会影响子表的记录。

    在实际开发中,我们很少使用物理的外键约束,一般使用逻辑的外键约束,因为物理外键约束只有在 InnoDB 引擎下才得以支持,而物理外键可以通过在两张表中存在某种结构来定义约束,而不使用 FORENGIEN KEY 这个关键词来定义。

    总结:

    列级约束使用比较多,表级约束很少使用,在以上几种约束中,NOT NULL 约束,DEFAULT 约束这两种约束不存在表级约束,它们只有列级约束,而对于其他的三种,PRIMARY KEY 约束,UNIQUE 约束,FORENGIEN KEY 约束,它们都可以存在表级和列级约束。

    约束分为以下几种:

    ⑴ 功能

        ① NOT NULL (非空约束)

        ② PRIMARY KEY(主键约束)

        ③ UNIQUE KEY(唯一约束)

        ④ DEFAULT(默认约束)

        ⑤ FROEIGN KEY(外键约束)

    ⑵ 数据列的数目

        ① 表级约束

        ② 列级约束

    以上为本人的一些学习笔记,如有出错欢迎指正,陆续更新!!!

    相关文章

      网友评论

          本文标题:MySQL约束

          本文链接:https://www.haomeiwen.com/subject/zxblzftx.html