约束用于确保数据库的数据满足特定的商业规则。MySQL中的常见约束有NOT NULL(非空), PRIMARY KEY(主键), FOREIGN KEY(外键), UNIQUE(唯一)和CHECK(检查)五种。其中,由于NOT NULL我们在之前的博文中已经用过很多次了,所以up此处只演示其余四种。
主键用于唯一的标示表中的数据,当对表中某个字段定义主键约束后,该列的数据不允许重复。在实际开发中,一般情况下每个表都会定义一个主键约束。
方式一 :
字段名 字段类型 PRIMARY KEY
方式二 :
PRIMARY KEY(字段名)
注意事项——
1° 定义主键约束的字段不允许重复,且不允许为空。2° 一张表最多只能有一个主键,但可以定义一个复合主键,格式为在定义表的字段的最后,加上一行“PRIMARY KEY(column_1, column_2…)”,定义复合主键后,要求在向表中添加数据时,复合主键约束的那几个字段不能完全相同,即允许有不完全相同。(后面我们会进行代码演示)
3° 使用DESC table_name可以快速查看表的主键。
定义自增长是为了使表中的某个整型字段(eg : id)能够从1开始自动的增长。
定义格式如下 :
字段名 整型 PRIMARY KEY AUTO_INCREMENT
使用格式如下 :
①INSERT INTO table_name(column1,column2…) VALUES(NULL, val2…);
②INSERT INTO table_name(column2,column3…) VALUES(val2,val3…);③INSERT INTO table_name VALUES(NULL, val2…);
PS :
1>传入NULL给定义了自增长的字段,实际会自动将1,2,3,4…..传给该字段。
2>一般地,自增长都会和PRIMARY KEY 一起配合使用,但也可以单独使用(单独使用时需要UNIQUE约束的配合)。3>一般地,自增长修饰的字段均为整型;实际浮点型也可以,但是使用频率非常低。
4>自增长默认从1开始,可以通过ALTER TABLE table_name AUTO_INCREMENT = ___; 语句来修改。
5>若向自增长修饰的字段传入了一个指定值,则以指定值为准进行自增长。并且,一般地,若程序员手动指定了自增长的默认值,就按照指定后自增长的规则来添加数据。(要专一)
先来创建一张水果表,并定义水果编号字段fno为主键,代码如下 :
尝试向水果表中添加 “fno = 2,但fname和fswe均与表中已存在的fno = 2的记录不同” 的数据,如下 :
这时Navicat会报错,提示主键不允许重复,如下图所示 :
继续,尝试向水果表中添加fno = 4,但fname和fswe均与表中已存在记录相同的数据,如下 :
继续,尝试向水果表中添加fno = NULL的数据,如下 :
可以看到fno字段做了PRI(主键)的标记。
定义一个新的水果表fruit_2,并为其字段fno和fname设置复合主键约束,代码如下 :
尝试向fruit_2水果表中添加fno = 3,fname = ‘grape_2’的数据,如下 :
尝试向水果表fruit_2中添加fno = 3, fname = ‘grape’, fcolor = ‘blue’的数据,如下 :
先来建一张学生表,指定id为主键并且设置自增长,代码如下 :
向学生表中添加数据,代码如下 :
当某个字段定义了UNIQUE约束后,表示该列数据的值是唯一的,不能重复。
字段名 字段类型 UNIQUE
注意事项——
1° 对于UNIQUE约束的字段,若没有定义NOT NULL约束,则该字段是允许有多个NULL的。(即NULL允许重复)
2° 一张表可以有多个UNIQUE约束的字段。
3° 仍然可以在DESC显示出的表结构中,查看表中约束条件的情况。
先来建一张水果表fruit_3,玩儿得花一点,对表中所有字段都添加UNIQUE约束,代码如下 :
尝试向表中添加fno = 4,fname = ‘pear’, fswe = 11, fcol = NULL的数据,如下 :
可见,单独定义UNIQUE字段是允许有多个NULL存在的。
同样,可以使用DESC查看fruit_3表的结构,如下图所示 :
可以看到,同时定义了UNIQUE约束与NOT NULL约束的字段,就相当于一个主键约束的字段。

外键用于定义主表和从表之间的关系。外键约束要定义在从表上;主表则必须具有PRIMARY KEY约束或UNIQUE约束。
当从表中的字段定义了外键约束后,要求该字段的数据必须在主表的主键列存在或者为NULL(注意此处指的是从表中的数据为NULL,且前提是主表对应的字段在定义时允许为NULL),否则无法向从表中添加数据;并且,如果想删除主表主键列的某条数据,必须要求从表中没有相应的数据与之关联,即在外键约束下,数据无法任意删除。
FOREIGN KEY (从表字段名) REFERENCES 主表名(主键名或UNIQUE字段名)
注意事项——
①外键关系要在创建表时单独定义,类似于单独定义主键的方式,写在字段的最后。②INNODB类型的表才支持外键
③外键约束的字段类型要和对应主键的字段类型一致(长度可以不同)
④若一张从表中要定义多个外键(即与多张主表发生关联), 则不同的外键要单独定义。
建立如下的主表与从表关系 : (主表为班级表classes,从表为学生表stus)
代码如下 :
尝试向从表中添加“s_classId字段在主表中对应的c_id不存在”的数据(也就是说两个班级编号对不上),如下 :
显然不成功,因为主表中并不存在c_id = 50, 75或140的记录。将s_classId改为在主表中c_id字段存在的值,再次尝试添加,如下 :
尝试删除主表中的某条记录,由于此时在从表中定义了外键约束,并且已经有相关记录与之关联,所以一定会删除失败,如下 :
先删除从表中与主表主键字段的某个数据相关联的全部记录,便可以删除主表中主键对应数据的记录。如下 :
CHECK用于强制限制行数据(记录)必须满足的条件。若某个字段使用CHECK约束进行了修饰,那么向表中添加记录时,要求这一具体的字段必须满足CHECK约束的条件,否则报错。
PS :Oracle 和 SQL Server均支持CHECK,MySQL8.0开始也支持CHECK(MySQL5.7版本仅支持CHECK的语法校验,但并不会实际生效)。
字段名 字段类型 CHECK(check_expression)
注意事项——
①在MySQL中实现CHECK的功能,一般是在程序中控制,或者通过触发器来完成。
先来建一张水果表,要求水果名必须带grape,并且要求水果的甜度必须大于等于10。代码如下 :
尝试向表中添加不符合CHECK约束的记录,如下 :
Navicat会报错,提示不满足CHECK约束条件,如下 :
将其修改为复合CHECK约束条件的记录,并再次尝试添加,如下 :
System.out.println(“END——————————————————————————”);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/208295.html