MySQL的约束条件:
目录
前言:
约束的分类:
角度1:按照约束的字段个数进行分类
单列约束:
多列约束:
角度2:按照约束的作用范围进行分类
列级约束:
表级约束:
角度3:按照约束的功能进行分类
非空约束:
特点:
添加非空约束:
删除非空约束:
唯一约束:
特点:
添加唯一约束:
删除唯一约束:
主键约束:
特点:
添加主键约束:
删除主键约束:
自增列:
特点和要求:
添加:
删除:
外键约束:
主表和从表:
特点:
添加外键约束:
删除外键约束:
约束等级:
建立外键约束和不建立外键约束的区别:
注意:
检查约束:
默认值约束:
添加默认约束:
删除默认约束:
前言:
数据完整性是指数据的精确性和可靠性。是防止数据库中不存在符合语义规定的数据和防止因错误信息的输入输出造成无效操作信息而提出的。为了保证数据的完整性,SQL规范以约束的方式来对数据表进行额外的条件限制。从以下四个方面考虑:实体完整性、域完整性、引用完整性和用户自定义完整性。
约束是表级的强制规定。可以在创建表时规定约束(通过CREATE TABLE),或者在表创建之后通过ALTER TABLE语句规定约束。
修改约束:
通常是在CREATE TABLE时添加约束,或者在ALTER TABLE时增加约束。
删除约束:
在ALTER TABLE时删除约束。
约束的分类:
角度1:按照约束的字段个数进行分类
单列约束:
指的是约束规则仅作用于表中的某一个特定列(字段)。它是直接在定义该列的语句中指定的约束。也就是对一个字段单独设置的、限制该字段能存储什么数据的规则。
多列约束:
指的是约束规则作用于表中的两个或以上列(字段)的组合。该约束关注的是这些列的组合值必须满足的特定条件。也就是对多个字段组合在一起的值设置的限制。
角度2:按照约束的作用范围进行分类
列级约束:
直接在定义列时指定,只作用于该列本身。声明约束时,声明在对应字段的后面。
表级约束:
多列约束必须在定义完所有列之后,使用 CONSTRAINT
关键字(可选)在表级别进行定义。这是其语法上的显著特征。
角度3:按照约束的功能进行分类
非空约束:
关键字为NOT NULL,限定某个字段的值不允许为空。
特点:
默认所有类型的值都可以是NULL。非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空。一个表可以有很多列都分别限定了非空。空字符串不等于NULL,0也不等于NULL。
添加非空约束:
CREATE TABLE 表名(字段名 数据类型 (NOT NULL),字段名 数据类型 (NOT NULL),字段名 数据类型 (NOT NULL),...
);
ALTER TABLE 表名
MODIFY 字段名 数据类型 (NOT NULL);
注意:ALTER TABLE进行修改时,如果该字段的值存在NULL值,则不会修改成功。需要把NULL值改为非NULL值,才能进行修改。
删除非空约束:
ALTER TABLE 表名
MODIFY 字段名 数据类型 (NULL);
唯一约束:
关键字UNIQUE KEY,用于限制某个字段的值不能重复。允许出现多个空值。
特点:
同意表中可以有多个唯一约束。唯一约束可以是一个列的值唯一,也可以是多个列组合的值唯一。唯一约束允许列值为空。在创建唯一约束时,如果不给唯一约束命名,就默认和列名相同。MySQL会给唯一约束的列上默认创建一个唯一索引。
添加唯一约束:
CREATE TABLE 表名(字段名 数据类型 (UNIQUE [KEY]),//列级约束字段名 数据类型 (UNIQUE [KEY]),字段名 数据类型 (UNIQUE [KEY]),...([CONSTRAINT 约束的名字] UNIQUE [KEY](字段名,...))//表级约束
);
ALTER TABLE 表名
ADD CONSTRAINT 约束的名字 UNIQUE [KEY](字段名);
或者
ALTER TABLE 表名
MODIFY 字段名 数据类型 (UNIQUE KEY);
删除唯一约束:
删除唯一约束只能通过删除唯一索引的方式删除。删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。如果创建唯一约束时未指定名称,如果是单列,默认和列名相同;如果是组合列,就默认和()中排在第一个的列名相同。
ALTER TABLE 表名
DROP INDEX 约束名;
查看表的索引:
SHOW INDEX FROM 表名;
主键约束:
关键字PRIMARY KEY,用于唯一标识表中的一行记录。
特点:
主键约束相当于唯一约束加上非空约束,主键约束列不允许出现重复值和空值。
一个表最多只有一个主键约束,建立主键约束可以在列级创建,也可以在表级创建。
主键约束对应着表中的一列或者多列(复合主键)。
如果是多列组合的复合主键,那么这些列都不允许为空值,并且组合的值(所有的值)不允许重复。
MySQL的主键名总是PRIMARY KEY,就算命名了主键约束名也没用。
当创建主键约束时,系统默认会在所在列或者列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束,那么对应的索引就自动删除了。
需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就可能会破坏数据的完整性。
添加主键约束:
CREATE TABLE 表名(字段名 数据类型 (PRIMARY KEY),//列级字段名 数据类型,字段名 数据类型,...
);
CREATE TABLE 表名(字段名 数据类型,字段名 数据类型,字段名 数据类型,...PRIMARY KEY (字段名,...)//表级
);
ALTER TABLE 表名
ADD PRIMARY KEY(字段名);
删除主键约束:
ALTER TABLE 表名
DROP PRIMARY KEY;
自增列:
关键字AUTO_INCREMENT,某个字段的值自增。
特点和要求:
一个表最多只能有一个自增列;当需要产生唯一标识符或者顺序值时,可设置自增长;自增长列约束的列必须是键列(主键列,唯一键列);自增约束的列的数据类型必须是整数类型;如果自增列制定了0和NULL,会在当前最大值的基础上自增,如果自增列手动指定了具体值,直接赋值为具体值。
当主键上声明了AUTO_INCREMENT,添加数据时,就不要给逐渐对应的字段赋值了。默认初始值为1。
添加:
CREATE TABLE 表名(字段名 数据类型 PRIMARY KEY AUTO_INCREMENT,字段名 数据类型,字段名 数据类型,...
);
ALTER TABLE 表名
MODIFY 字段名 数据类型 AUTO_INCREMENT;
删除:
ALTER TABLE 表名
MODIFY 字段名 数据类型;
外键约束:
关键字FOREIGN KEY,用于限定某个字段的引用完整性,一个表中可以声明有多个外键约束。
主表和从表:
主表:被引用的表,被参考的表。
从表:引用别人的表,参考别人的表。
特点:
从表的外键列,必须引用主表的主键或者唯一约束的字段,因为被依赖的值必须是唯一的。
在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名,也可以指定外键约束名。
创建表时就指定外键约束的话,应该先创建主表,再创建从表。
删除表时,先删除从表(或者先删除外键约束),再删除主表。
当主表的记录被从表参照时,主表的记录将不允许删除(修改),如果要删除(修改)数据,需要先删除从表中依赖该数据记录的数据,才能删除(修改)主表中的数据。
添加外键约束:
CREATE TABLE 表名(字段名 数据类型,字段名 数据类型,字段名 数据类型,...CONSTRAINT 外键约束名 FOREIGN KEY (从表的字段)REFERENCES 主表(主表的字段)
);
ALTER TABLE 从表名
ADD CONSTRAINT 外键约束名 FOREIGN KEY (从表字段)
REFERENCES 主表(字段);
删除外键约束:
ALTER TABLE 从表名 DROP FOREIGN KEY 外键约束名;
然后删除对应的索引名(只能手动删除)
SHOW INDEX FROM 表名;//查看表的索引名
ALTER TABLE 从表名 DROP INDEX 索引名;
约束等级:
Cascade:在主表上修改或者删除时,同步修改或者删除对从表的匹配记录。
Set null:在主表上修改或者删除时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null。
No action:如果从表中有匹配的记录,则不允许主表对应的候选键进行修改或者删除。
Restrict:同no action,都是立即检查外键约束。
Set default:主表有变更时,从表将外键列设置为一个默认的值,但是InnoDB不能识别。
如果没有指定等级,就相当于Restrict方式。
对于外键约束,最好采用:No UPDATE CASCADE ON DELETE RESTRICT的方式。
建立外键约束和不建立外键约束的区别:
建立外键约束,操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。但是没有建立外键约束,操作不受限制(创建表、删除表、添加、修改、删除)不受限制,要保证数据的引用完整性。
注意:
在MySQL中,外键约束是有成本的,需要消耗系统资源,对于大并发的SQL操作,有可能会不适合,因为会有阻塞的行为会影响性能。所以MySQL允许不使用系统自带的外键约束,在应用层面完成检查数据一致性的逻辑。即使不用外键约束,也要想办法通过应用层的附加逻辑,来实现外键约束的功能,确保数据的一致性。
检查约束:
关键字CHECK,用于检查某个字段的值是否符合相应的要求,一般指的是值的范围。
MySQL5.7中可以使用检查约束,但是对数据验证没有任何作用,添加数据时,不会报错或者警告。MySQL8.0可以使用检查约束。
CREATE TABLE 表名(字段名 数据类型,字段名 数据类型 CHECK(检查要求)
);
如果不满足要求添加数据时会失败。
默认值约束:
关键字DEFAULT,用于给某个字段指定默认值,一旦设置默认值,在插入数据时,如果该字段没有显式赋值,则赋值为默认值。
添加默认约束:
CREATE TABLE 表名(字段名 数据类型 DEFAULT,字段名 数据类型 DEFAULT,字段名 数据类型 DEFAULT,...
);
ALTER TABLE 表名
MODIFY 字段名 数据类型 DEFAULT;
删除默认约束:
ALTER TABLE 表名
MODIFY 字段名 数据类型;
如果不想让字段中出现null值,可以加not null default或者default 0,避免未赋值时为null。因为null值不好比较,只能使用专门的is null和is not null来比较,效率不高,影响提高索引效果。