MySQL约束

概念:

为了保证数据的完整性和一致性,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(外键约束)

⑵ 数据列的数目

    ① 表级约束

    ② 列级约束

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 3,147评论 0 33
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,772评论 5 116
  • 接下来的一些内容,我们需要提前学一些简单的sql语句,方便大家理解接下来的知识。 DDL—数据定义语言(Creat...
    不排版阅读 403评论 0 1
  • 托尔斯泰写过一个小故事。讲述了一个关于皇帝的三个问题的故事。读后颇有感触。 1.做每件事的最佳时机是什么时候...
    028黄小丸阅读 101评论 0 0
  • 广义上讲: 轻量级与重量级是一个相对的概念,主要是对应用框架使用方便性和所提供 服务特性等方面做比较的。比方说EJ...
    背麻袋的袋鼠阅读 2,558评论 0 2