MySQLchapter1-约束总结

约束的概述

概念
在 MySQL 中,约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库,并且能够确保数据库中数据的正确性和有效性。
例如,在数据表中存放年龄的值时,如果存入 200、300 这些无效的值就毫无意义了。因此,使用约束来限定表中的数据范围是很有必要的。

分类
1)主键约束 primary key
2)唯一约束 unique key
3)外键约束 foreign key
4)非空约束 not null
5)检查约束 check
6)默认值约束 default constraint

约束的分类

非空约束

非空约束not null:指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空

创建表时添加非空约束:直接在数据类型的后面添加not null即可
在这里插入图片描述
表创建好之后才进行添加/删除非空约束的语法格式:

添加非空约束:
alter table 表名 modify 字段名 数据类型 not null;
在这里插入图片描述
删除非空约束:
alter table 表名 modify 字段名 数据类型 (null)【这个null可以写也可以不写】
在上面创建表之后添加非空约束的基础上删除非空约束:
在这里插入图片描述

唯一约束

唯一约束unique key:所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。

唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有多个空值,但是如果不是空值,那么就只能有一个。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束

创建表时添加唯一约束的格式:直接在数据类型的后面添加unique (key)
在这里插入图片描述
表创建完成之后再进行添加/删除唯一约束:
添加唯一约束:
alter table 表名 modify 字段名 数据类型 unique (key);这一种形式并没有自定义唯一约束的名字,此时需要调用show create table 表名才可以知道系统默认定义的唯一约束名

alter table 表名 add constraint 唯一约束名 unique (限定修饰的对应的字段名); 这一种形式可以自定义唯一约束的名字

删除唯一约束:
alter table 表名 drop index 唯一约束名;注意不要忘了index

调用show create table 表名从而知道唯一约束名,因此如果是在创建表的时候就添加了唯一约束,那么这时候如果想要通过“alter table 表名 drop index 唯一约束名 ”来删除唯一约束,只能通过调用show create table 表名知道唯一约束名在进行删除唯一约束,因为创建表是添加唯一约束是直接在数据类型后面添加unique,如果试图添加唯一约束名就会发生报错
在这里插入图片描述
自定义唯一约束名
在这里插入图片描述

主键约束

主键约束primary key, 是MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。

使用主键应注意以下几点:
1)每个表只能定义一个主键。如果在创建表的时候定义了多个主键,那么就会发生报错,提示定义了多个主键。
在这里插入图片描述
2)主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。如果主键后面有自动增长auto_increment,那么主键此时即使为null,也不会发生报错,因为auto_increment的初始值为1,等一下会再说明。
在这里插入图片描述
3)一个字段名只能在联合主键字段表中出现一次。
4)联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

创建表的时候添加主键约束语法格式:直接在数据类型后添加primary key。例如上面的例子中就是在创建表的时候添加主键约束。

表创建好之后才添加主键约束语法格式:
alter table 表名 modify 字段名 数据类型 primary key;
表创建的时候并没有添加主键约束:
在这里插入图片描述
注意的是在表创建好(没有添加主键约束)之后,向表中插入的id中可以是null值,但是此时在添加主键约束,就会发生报错,因为主键约束不允许为null,因此需要保证id不含有null值才可以在添加主键约束
一上面的例子为基础,如下面的代码:
在这里插入图片描述
删除主键约束的语法格式:
alter table 表名 drop primary key;
以上面的例子为基础:
在这里插入图片描述
但是通过仔细观察,我们可以看到NULL那里id是NO,而其他的两个字段都是YES,是说明了什么呢?将插入一个id为null的例子试试看:
在这里插入图片描述
我的天,竟然会发生报错,这是为什么呢?输入show create table student可以更加清楚的看到了原来id还有一个非空约束not null修饰着
在这里插入图片描述
只有在删除这个非空约束的时候才可以输入null,使得id为null
在这里插入图片描述
通过这里,个人认为这里更能表达清楚了为什么主键是不允许null,因为在删除primary key之后的字段还被非空not null修饰了。表明了主键实际上是非空约束not null 和唯一约束unique的组合体,因为唯一约束保证修饰的字段是唯一的。当然这只是我的个人想法,如果大家有更好的想法,请指正哈!😄😄😄

主键约束之自增长auto_increment
创建表的时候添加自增长语法格式:在整数数据类型的后面添加auto_increment即可。注意必须是整数类型的,并且这个整数是一个被xxx key修饰了,例如primary key/unique key等,但通常是primary key。

一些注意事项:
1)默认情况下,AUTO_INCREMENT 的初始值是 1,每新增一条记录,字段值自动加 1
2)一个表中只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分),自增长通常跟主键搭配
3)AUTO_INCREMENT 约束的字段必须具备 NOT NULL 属性
4)AUTO_INCREMENT 约束的字段只能是整数类型
5)AUTO_INCREMENT 约束字段的最大值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效。

自增长特定:
① 任何一个字段要做自增长前提必须是一个key,否则就会发生报错;
在这里插入图片描述
这个字段做自增长时被unique修饰和被primary key修饰进行了对比(这一部分不是很懂,希望大佬们指正):
在这里插入图片描述

② 自增长字段必须是整型数字

创建表之后才添加/删除auto_increment的语法格式:

添加auto_increment:

1)alter table 表名 modify 字段名(必须是一个key修饰,例如被primary key修饰) 数据类型(必须是整形) auto_increment;这种格式针对的是这个字段已经被primary/unique key修饰了,即类似于id int primary key这种情况。

2)alter table 表明 modify 字段名 数据类型 primary/unique key auto_increment;这种格式针对于这个字段没有被其他的字段修饰,即类似于id int这样子,那么此时要先保证这个字段是被key修饰的,因此要加上primary/unique key。
在这里插入图片描述
删除自增长的语法格式:
alter table 表名 modify 字段名 数据类型
下面的例子是基于上面创建表之后添加自增长的例子进行删除的:
在这里插入图片描述

外键约束

外键约束foreign key:是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

创建表的时候定义外键约束(需要在从表中)格式:
constraint 外键名 foreign key (字段名) references 主表名 (主键名)
在这里插入图片描述
通过这样就实现了两个表之间有了关联。但是有一些地方需要注意的是:
外键约束的作用:阻止执行
1)从表插入新行,其外键值不是主表的主键值便阻止插入;
2)从表修改外键值,新值不是主表的主键值便阻止修改;
3)主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
4)主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)

依旧是在上面的例子的基础上:这里主要解析前两点,后面两点是同样的道理。
在这里插入图片描述
删除表时,应该先删子表,后删父表,除非使用casecade constraints 解除关联。
先删除父表时会报错:有一个被foreign keys关联的 key的字段在子表中

表创建完毕之后添加/删除外键约束的语法格式:

删除外键:
alter table 外表名 drop foreign key 外键名;
在这里插入图片描述
添加外键:
alter table 外表名 add constraint 外键名(自己定义的)foreign key (从表中的外键,是一个字段名,和主表中的主键是对应的,数据类型要求相同)references 主表名 (主键名);
这里值得注意的是,如果在从表中含有从键的值和主键的值是不对应的,那么就不可以直接通过执行这个命令来实现添加外键约束,而是先要删除从表中和主键值不对应的从键值,然后再执行这个命令来实现添加外键约束,以上面刚刚删除了外键约束的代码为例子:
在这里插入图片描述

定义外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为主表定义主键
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键
  • 外键中列的数目必须和主表的主键中列的数目相同
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同

做出级联操作的时候,才可以实现主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。否则是没有办法对主表中和从表相关联的数据进行相关的操作,但是可以对没有关联的进行操作,即当在主键表中删除/更改对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更改。(即外键表约束主键表)如果没有,那么就可以进行删除

外键约束之级联更新
在添加外键约束语句的后面添加ON UPDATE CASCADE即可,从而实现了对主表中和从表对应的值进行更改的时候,从表中对应的值也随之进行更改,而如果没有ON UPDATE CASCADE时进行更改的时候就会发生报错
在这里插入图片描述
外键约束之级联删除:
在添加外键约束语句的后面添加ON DELETE CASCADE即可,当然也可以在级联更新的后面写ON DELETE CASCADE(只是前者只能实现删除,后者既能实现更新,又可以实现删除),从而实现了对主表中和从表对应的值进行删除的时候,从表中对应的值也随之进行删除,而如果没有ON UPDATE CASCADE时进行更改的时候就会发生报错
在这里插入图片描述

检查约束

检查约束check:是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。

创建表时检查约束:check (表达式);注意这种方式没有办法直接知道检查表达式的名字,需要执行show create table 表名才可以知道检查约束名,只有知道检查约束名之后才可以进行相应的语句进行删除检查约束
在这里插入图片描述
创建表完毕之后添加/删除检查约束:
添加约束:
alter table 表名 add constraint 检查约束名 check(表达式);这种方式可以自定义了检查约束名,从而不需要执行show create table 表名来获取检查约束名,直接删除检查约束了

删除检查约束:
alter table 表名 drop check 检查约束名
在这里插入图片描述

默认值约束

默认值约束(default):用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值

创建表时添加默认约束:直接在数据类型的后面添加default 默认值,注意如果对应的数据类型是一个字符串,那么需要用单引号将默认值括起来
在这里插入图片描述
表创建完毕之后,进行添加/删除默认值约束:

添加默认值约束语法格式:
alter table 表名 change column 字段名 字段名 数据类型 default 默认值;注意的是有两个字段名,并且是相同的,不要遗忘了

删除默认值是在添加默认值约束的基础上进行修改的,只是将default 默认值改为defalut null即可,即alter table 表名 change column 字段名 字段名 数据类型 default null

在上面的基础上进行添加/删除默认值约束:
在这里插入图片描述
如果有说的不好的地方,请大家指正哈

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值