为防止数据表中插入错误的数据,MySQL定义了一些维护数据库完整性的规则,即表的约束。常用的约束分为五种:默认约束、非空约束、主键约束、唯一约束和外键约束
目录
默认约束
非空约束
唯一约束
主键约束
自动增长
默认约束
默认约束用来为数据表中的字段指定默认值,即没有给字段赋值时系统会自动给它一个默认值
默认值用DEFAULT关键字定义的,其语法格式:
字段名 数据类型 DEFAULT 默认值;
注意:BLOB、TEXT数据类型不支持默认约束
//创建表时添加默认约束
mysql>CREATE TABLE mytable(
-> age INT UNSIGNED DEFAULT 18 //添加默认约束
-> );
//为现有表添加或删除默认约束
//删除默认约束
mysql>ALTER TABLE mytable MODIFY age INT UNSIGNED;
//添加默认约束
musql>ALTER TABLE mytable MODIFY age INT UNSIGNED DEFAULT 18;
非空约束
非空约束是指字段的值不能为NULL
在MySQL中,非空约束是通过NOT NULL来定义的,其语法格式:
字段名 数据类型 NOT NULL
注意:非空约束与值为NULL的默认约束不能同时存在,否则数据表会创建失败
//创建表时添加非空约束
mysql>CREATE TABLE mytable(
-> name VHAR(10) NOT NULL,
-> age INT NOT NULL DEFAULT 18 //添加非空约束
-> );
//为现有表添加或删除非空约束
//删除非空约束
mysql>ALTER TABLE mytable MODIFY age INT NOT NULL;
//添加非空约束
musql>ALTER TABLE mytable MODIFY age INT NOT NULL DEFAULT 18;
唯一约束
唯一约束用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,MySQL的唯一约束允许存在多个NULL值
唯一约束用过UNIQUE定义,其语法格式:
#列级约束
字段名 数据类型 UNIQUE;
#表级约束
UNIQUE(字段名1,字段名2,...);
列级约束和表级约束为MySQL中两种定义约束的方式:列级约束定义在一个列上,只对该列起约束作用,表级约束独立于列的定义,可应用于表的多个列上
#列级约束
mysql>CREATE TABLE mytable (
-> id INT UNSIGNED UNIQUE,
-> name VARCHAR(10) UNIQUE
-> );
#表级约束
mysql>CREATE TABLE mytable (
-> id INT UNSIGNED ,
-> name VARCHAR(10) ,
-> UNIQUE (id),
-> UNIQUE(name)
-> );
注意:当表级列表仅建立在一个字段上时,其作用效果与列级约束相同
#删除唯一约束
mysql>ALTER TABLE mytable DROP INDEX id;
#添加唯一约束
mysql>ALTER TABLE mytable ADD UNIQUE (id);
创建复合唯一约束:只有多个字段的值相同时才视为重复记录
mysql>CREATE TABLE mytable (
-> id INT UNSIGNED,username VARCHAR(10),
-> UNIQUE(id,username)
-> );
主键约束
主键主要用来唯一标识表中的记录,类似于指纹、身份证用于标识人的身份一样
主键约束通过PRIMARY KEY定义,相当于唯一约束和非空约束的组合
主键约束也分为列级和表级,其语法格式如下:
#列级约束
字段名 数据类型 PRIMARY KEY
#表级约束
PRIMARY KEY(字段名1,字段名2......)
mysql>CREATE TABLE mytable (
-> id INT PRIMARY KEY,
-> name VARCHAR(10)
-> );
删除主键约束
mysql>ALTER TABLE mytable DROP PRIMARY KEY;
注意:为某字段添加主键约束后,该字段相当于有了非空约束和唯一约束,但是删除它的主键约束后,该字段的非空约束并没有删除
自动增长
在为表设置主键约束后,每次插入数据都要检查主键的值,为了防止插入值重复导致插入失败,我们可以使用自动增长功能来自动生成主键的值
自动增长功能用AUTO_INCREMENT来实现,其基本语法如下:
字段名 数据类型 AUTO_INCREMENT
mysql>CREATE TABLE mytable (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(20)
-> );
使用AUTO_INCREMENT时需注意以下四点:
- 一个表只能有一个自动增长字段,并且该字段的数据类型是整数类型且必须定义为键,如UNIQUE KEY、PRIMARY KEY
- 若为自动增长字段插入NULL、0、DEFAULT或在插入时省略该字段,该字段都会自动使用自动增长值;若插入为具体值,则不会使用自动增长值
- 自动增长值从1开始自增并且每次加1,若插入的值大于自动增长的值,则下次插入的自动增长值会自动使用最大值加1;若插入的值小于自动增长值,则不会对自动增长值产生影响
- 使用DELETE删除记录时,自动增长值不会减小或填补空缺
#修改自动增长值
mysql>ALTER TABLE mytable AUTO_INCREMENT = 10;
#删除自动增长
mysql>ALTER TABLE mytable MODIFY id INT;
#添加自动增长
mysql>ALTER TABLE mytable MODIFY id INT AUTO_INCREMENT;
在为字段删除自动增长并重新添加自动增长后,自动增长的初始值主动设为该列现有的最大值+1
修改自动增长值时,若自动增长值小于该列现有的最大值则修改不会生效