MySQLchapter1-约束总结

上网导航 2023-10-19 303 0条评论
摘要: 文章目录约束的概述约束的分类主键约束约束的概述概念:在 MySQL 中,约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库...

文章目录

约束的概述

概念:

在 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即可。

MySQLchapter1-约束总结

表创建好之后才进行添加/删除非空约束的语法格式:

添加非空约束:

alter table 表名 modify 字段名 数据类型 not null;

MySQLchapter1-约束总结

删除非空约束:

alter table 表名 modify 字段名 数据类型 (null)【这个null可以写也可以不写】;

在上面创建表之后添加非空约束的基础上删除非空约束:

MySQLchapter1-约束总结

唯一约束

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

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

创建表时添加唯一约束的格式:直接在数据类型的后面添加unique (key)。

MySQLchapter1-约束总结

表创建完成之后再进行添加/删除唯一约束:

添加唯一约束:

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,如果试图添加唯一约束名就会发生报错:

MySQLchapter1-约束总结

自定义唯一约束名:

MySQLchapter1-约束总结

主键约束

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

使用主键应注意以下几点:

1)每个表只能定义一个主键。如果在创建表的时候定义了多个主键,那么就会发生报错,提示定义了多个主键。

MySQLchapter1-约束总结

2)主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。如果主键后面有自动增长auto_increment,那么主键此时即使为null,也不会发生报错,因为auto_increment的初始值为1,等一下会再说明。

MySQLchapter1-约束总结

3)一个字段名只能在联合主键字段表中出现一次。

4)联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

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

表创建好之后才添加主键约束语法格式:

alter table 表名 modify 字段名 数据类型 primary key;

表创建的时候并没有添加主键约束:

MySQLchapter1-约束总结

注意的是在表创建好(没有添加主键约束)之后,向表中插入的id中可以是null值,但是此时在添加主键约束,就会发生报错,因为主键约束不允许为null,因此需要保证id不含有null值才可以在添加主键约束。

一上面的例子为基础,如下面的代码:

MySQLchapter1-约束总结

删除主键约束的语法格式:

alter table 表名 drop primary key;

以上面的例子为基础:

MySQLchapter1-约束总结

但是通过仔细观察,我们可以看到NULL那里id是NO,而其他的两个字段都是YES,是说明了什么呢?将插入一个id为null的例子试试看:

我的天,竟然会发生报错,这是为什么呢?输入show create table student可以更加清楚的看到了原来id还有一个非空约束not null修饰着。

MySQLchapter1-约束总结

只有在删除这个非空约束的时候才可以输入null,使得id为null。

MySQLchapter1-约束总结

通过这里,个人认为这里更能表达清楚了为什么主键是不允许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,否则就会发生报错;

MySQLchapter1-约束总结

这个字段做自增长时被unique修饰和被primary key修饰进行了对比(这一部分不是很懂,希望大佬们指正):

MySQLchapter1-约束总结

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

创建表之后才添加/删除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。

MySQLchapter1-约束总结

删除自增长的语法格式:

alter table 表名 modify 字段名 数据类型;

下面的例子是基于上面创建表之后添加自增长的例子进行删除的:

MySQLchapter1-约束总结

外键约束

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

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

在创建表的时候定义外键约束(需要在从表中)格式:

constraint 外键名 foreign key (字段名) references 主表名 (主键名);

MySQLchapter1-约束总结

通过这样就实现了两个表之间有了关联。但是有一些地方需要注意的是:

外键约束的作用:阻止执行

1)从表插入新行,其外键值不是主表的主键值便阻止插入;

2)从表修改外键值,新值不是主表的主键值便阻止修改;

3)主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);

4)主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

依旧是在上面的例子的基础上:这里主要解析前两点,后面两点是同样的道理。

MySQLchapter1-约束总结

删除表时,应该先删子表,后删父表,除非使用casecade constraints 解除关联。

先删除父表时会报错:有一个被foreign keys关联的 key的字段在子表中

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

删除外键:

alter table 外表名 drop foreign key 外键名;

MySQLchapter1-约束总结

添加外键:

alter table 外表名 add constraint 外键名(自己定义的)foreign key (从表中的外键,是一个字段名,和主表中的主键是对应的,数据类型要求相同)references 主表名 (主键名);

这里值得注意的是,如果在从表中含有从键的值和主键的值是不对应的,那么就不可以直接通过执行这个命令来实现添加外键约束,而是先要删除从表中和主键值不对应的从键值,然后再执行这个命令来实现添加外键约束,以上面刚刚删除了外键约束的代码为例子:

MySQLchapter1-约束总结

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

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

外键约束之级联更新:

在添加外键约束语句的后面添加ON UPDATE CASCADE即可,从而实现了对主表中和从表对应的值进行更改的时候,从表中对应的值也随之进行更改,而如果没有ON UPDATE CASCADE时进行更改的时候就会发生报错。

MySQLchapter1-约束总结

外键约束之级联删除:

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

MySQLchapter1-约束总结

检查约束

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

创建表时检查约束:check (表达式);注意这种方式没有办法直接知道检查表达式的名字,需要执行show create table 表名才可以知道检查约束名,只有知道检查约束名之后才可以进行相应的语句进行删除检查约束。

MySQLchapter1-约束总结

创建表完毕之后添加/删除检查约束:

添加约束:

alter table 表名 add constraint 检查约束名 check(表达式);这种方式可以自定义了检查约束名,从而不需要执行show create table 表名来获取检查约束名,直接删除检查约束了。

删除检查约束:

alter table 表名 drop check 检查约束名;

MySQLchapter1-约束总结

默认值约束

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

创建表时添加默认约束:直接在数据类型的后面添加default 默认值,注意如果对应的数据类型是一个字符串,那么需要用单引号将默认值括起来。

MySQLchapter1-约束总结

表创建完毕之后,进行添加/删除默认值约束:

添加默认值约束语法格式:

alter table 表名 change column 字段名 字段名 数据类型 default 默认值;注意的是有两个字段名,并且是相同的,不要遗忘了。

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

在上面的基础上进行添加/删除默认值约束:

MySQLchapter1-约束总结

如果有说的不好的地方,请大家指正哈!

文章版权及转载声明:

作者:上网导航本文地址:https://www.90xe.com/post/6220.html发布于 2023-10-19
文章转载或复制请以超链接形式并注明出处技术导航

分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏