文章目录
约束的概述
概念:
在 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。
在上面的基础上进行添加/删除默认值约束:
如果有说的不好的地方,请大家指正哈!