数据库的约束详解(1)
数据库中的约束是为了保证数据表里数据的完整性。约束是在表上强制执行数据的校验规则,除此之外,当表中数据存在相互依赖性时,可以保护相关的数据不被删除。
大部分的数据库支持以下常见的五种完整性约束。
1. NOT NULL: 非空约束,指某列不能为空。
2. UNIQUE: 唯一约束,指定某列或则几列组合不能重复。
3. PRIMARY KEY: 主键约束,指定该列的值可以唯一地标识该条记录。
4. FOREIGN KEY: 外键约束,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。
5. HCECK: 检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。
MySQL不支持CHECK约束,约束也是数据库对像,并被存储在系统表中,也拥有自已的名子。
根据约束对数据列的限制,约束可以分为单列约束和多列约束。在创建表的时候指明约束,也可以在创建后,以修改表的方式增加约束。
约束的语法形式分为:
1.列级约束
create table table_name(
字段1 数据类型 约束类名,
字段2 数据类型,
字段3 数据类型,
);
2. 表级约束
1. 添加约束
create table table_name(
字段1 数据类型,
字段2 数据类型,
字段3 数据类型,
constraint 约束名 约束类名(field1,field2...)
);
上面是创建表时指明的,以修改表的方式添加或删除约束的方法如下,不同的方式适用于不同的情况。1. 添加约束
方式1:alter table table_name add 约束名(field1,field2...);
方式2:alter table table_name modify 字段 字段类型 约束名;
注意:NOT NULL约束不支持add的方法,只能采用modify2. 删除约束
大部分的数据库采用“drop constraint 约束名”语法来删除约束,但是在mysql中要使用“drop index 约束名”。如果不知道约束名,可以采用show create table table_name命令来查看表的创建信息,从而知道约束名,然后再执行下面的命令:
alter table table_name drop index 约束名
一. NOT NULL约束首先,需要说明,NULL是空,不知道!不是0,也不是空字符串,所有的数据类型都可以是NULL,包括int,float等。
创建表时,指定列为非空约束只要在列定义后加上NOT NULL即可。
可以采用如下命令去修改一列为空/非空约束,同时指定默认值。
alter table table_name 字段名 字段类型 [default 默认值] NULL/NOT NULL;
如果该列有NOT NULL约束,那么插入记录时,必须显式的给定一个不为NULL的值,或者将该列设置为不为NULL的默认值,这样插入时可以不理会该列。
因为表中每一列都是由列名和数据类型组成,所以在使用modify命令时,后面都要跟上完成的列,然后再跟上约束类型。
二. UNIQUE 约束
唯一性约束用于指定某列不能出现重复值,有一个例外是,虽然该列不能出现重复的值,但可以出现多个NULL值,因为数据库中NULL不等于NULL;
注意:同一个表内可以建多个唯一约束,唯一约束也可以由多个列组成。当为某列创建唯一约束时,MySQL会为该列相应的创建唯一索引。如果不给唯一约束起名,它默认与列名相同。
列级唯一约束直接在列属性后面加上unique。
表级唯一约束可以采用下面的语法形式:
[constraint 约束名] 约束定义(字段1,字段2...)
添加和删除唯一约束
添加
因为表中每一列都是由列名和数据类型组成,所以在使用modify命令时,后面都要跟上完成的列,然后再跟上约束类型。
二. UNIQUE 约束
唯一性约束用于指定某列不能出现重复值,有一个例外是,虽然该列不能出现重复的值,但可以出现多个NULL值,因为数据库中NULL不等于NULL;
注意:同一个表内可以建多个唯一约束,唯一约束也可以由多个列组成。当为某列创建唯一约束时,MySQL会为该列相应的创建唯一索引。如果不给唯一约束起名,它默认与列名相同。
列级唯一约束直接在列属性后面加上unique。
表级唯一约束可以采用下面的语法形式:
[constraint 约束名] 约束定义(字段1,字段2...)
添加和删除唯一约束
添加
alter table table_name add unique(字段1,字段...);
alter table table_name modify 字段 数据类型 unique;
删除:
alter table table_name drop index 约束名(默认等于列名);
create table table_name(
字段1 数据类型,
字段2 数据类型,
字段3 数据类型,
constraint 约束名 unique(字段1,字段2...)
);
如果该列有UNIQUE约束,那么插入记录时,该列的值在表中不能存在,否则报错。
三. PRIMARY KEY 约束
主键约束相当于非空约束和唯一约束的组合,既不能重复,也不能为NULL。如果为多列创建主键约束,那多列中包含的每一个列都不能为空,但只要求这些组合不能重复。
什么意思?比如一个学生信息表,可以用学号作为主键,学号可以唯一标识一条学生信息,但是学号一般又由什么构成呢?一个学校的学号编排规则一般是 年级+班级+班级中学生编号,其中班级中的学生编号是不能得复的!
每一个表中最多只能有一个主键,但这一个主键可以有多列组成,同样主键约束的添加也有列级约束语法和表级约束语法。
当创建主键约束时,MySQL在主键约束所在列或列组合上建立对应的唯一索引。
关于主键约束,还有一点是主键自增,采用auto_increment关键字来设置。
create table table_name(
字段1 数据类型 auto_increment primary key,
字段2 数据类型
);
指定自增长功能通常用于设置逻辑主键列——该列的值没有物理意义,仅仅用于标识每行记录。
主键创建相关的SQL语句:
1. 使用列级约束语法
desc table_name; 查看表的结构,KEY字段下面是否标明PRI,这也是查看其它约束的方法
或
show create table table_name \G 可以查看表创建的详细信息(包括存储引擎和编码类型)
5. 给表增加主键
6. 给主键设置自动增长
通过show create table table_name看到字段的属性,又由上面的6可知设置自动增长的方法。所以删除自动增长本质上就是更改字段属性。
1. 使用列级约束语法
create table table_name(
id int primary key,
name varchar(10)
);
2. 使用表级约束语法
create table table_name(
id int,
name varchar(10)
primary key(id)
);
3. 使用表级约束语法创建联合主键,并命名为pk
create table table_name(
id int,
name varchar(10),
constraint pk primary key(id,name)
);
4. 查询一个表的主键
desc table_name; 查看表的结构,KEY字段下面是否标明PRI,这也是查看其它约束的方法
或
show create table table_name \G 可以查看表创建的详细信息(包括存储引擎和编码类型)
5. 给表增加主键
alter table table_name add primary key(字段1,字段2...);
或
alter table table_name modify 字段名 数据类型 primary key;
第一种方法可以添加联合主键,第二种方法只能把一列设置为主键6. 给主键设置自动增长
alter table table_name modify id int auto_increment primary key;
7. 删除表的主键,如果设置了自动增长要先删除自动增长,否则报错通过show create table table_name看到字段的属性,又由上面的6可知设置自动增长的方法。所以删除自动增长本质上就是更改字段属性。
删除自动增长,实际上就是修改属性:
alter table table_name change id id int;
删除主键,因为一个表中只有一个主键,所以不用指定名子。
alter table table_name drop primary key;
MySQL支持建表时指定CHECK约束,但是不会起作用。CHECK的语法很简单:
create table tabl_name(
id int auto_increment,
name varchar(10),
salary decimal,
primary key(id),
check(salary > 0)
);
从上面可以看出,在建表时,只需要在列后面指定check(逻辑表达式)即可。
还有一个外键约束,在下一节学习。