约束
我们可以给表中的字段加上一些约束,来保证表中的数据是有效的
按约束的功能分类
- 非空约束 : not null
- 唯一性约束 : unique
- 主键约束 : primary key
- 外键约束 : foreign key
- 默认值约束 :default
- 检查约束 : check ( MySQL 不支持,Oracle 支持 )
可以多个约束对一个字段使用
例:create table table_1 ( id int , name char ( 5 ) not null unique ) ;
非空约束 ( not null )
其约束的字段不能为 NULL ,当插入数据时,若该字段为 NULL ,则会报错
例:create table table_1 ( id int , name char ( 5 ) not null ) ;
唯一性约束 ( unique )
其约束的字段不能重复,但可以有多个 NULL
例:create table table_1 ( id int unique , name char ( 5 ) ) ;
主键约束 ( primary key )( 很重要 )
( 主键字段 即添加了主键约束的字段,主键值 即主键字段上的值 )
- 给某个字段添加主键约束之后,该字段既不能为0,也不能重复,相当于 not null + unique 的效果
- 主键值是当前行数据的唯一标识,即如果表中的两行数据是完全相同的,但只要主键值不同,即可认为是完全不同的数据
- 每张表都有且只有一个主键约束!!! 如果一张表没有主键约束,则该表是无效的,主键虽然只能有一个,但可以由多个字段联合组成
- 如果只有一个字段组成的主键,称为单一主键,如果由多个字段组成,则称为复合主键
例:
create table table_1 ( id int primary key , name char ( 5 ) ) ;
create table table_1 ( id int , name char ( 5 ) , primary key ( id, name ) ) ;
自增主键 ( auto_increment )
只适用于整数类型主键,自增从 1 开始
例:create table table_1 ( id int primary key auto_increment , name char ( 5 ) ) ;
外键约束 ( foreign key )
( 外键字段 即添加了外键约束的字段,外键值 即外键字段上的值 )
- 外键约束用来在两个表之间建立连接
- 外键可以有一个或者多个,外键不是自身表的主键,但是关联的是其他表主键( 其实不一定是主键,只要有unique约束即可,但一般都是主键 )
- 一个表的外键可以为空,但如果不为空值,则每一个外键值必须等于另一个表的主键值中的某个值
- 主表( 父表 )即关联中主键所在表,从表 ( 子表 )即关联中外键所在表
- 删除表与数据的顺序是先主再从,添加表或数据的顺序是先从再主
例:create table table_1 ( id int , name char ( 5 ) , foreign key ( name ) references table_2 ( name_1 ) );
( references 即是参考的意思 )
默认值约束 ( default )
如果不指定默认值,则默认值为 NULL
例:create table table_1 ( id int , name char ( 5 ) default ‘ candy ’ ) ;
按约束的位置分类
- 列级约束 ( 对于一个字段 )
- 表级约束 ( 对于一个或多个字段 )
在创建表的时候添加列级约束只支持:默认约束,非空约束,主键约束,唯一性约束
在添加表级约束只支持:主键约束,唯一性约束,外键约束
列级约束
直接添加在一个字段后面的约束,相当于只对这个字段生效
例:create table table_1 ( id int , name char ( 5 ) default ‘ candy ’ ) ;
表级约束
单独写,对其中包括的字段都生效
例:create table table_1 ( id int , name char ( 5 ) , unique ( id, name ) ) ;
( 相当于 id 与 name 联合起来唯一 )
对于约束的操作
添加约束
- alter table 表名 modify 字段名 数据类型 约束; ( 修改字段属性的时候加上约束 )
- alter table 表名 change 旧字段名 新字段名 数据类型 约束; ( 修改字段名字的时候加上约束 )
- alter table 表名 add 字段1 数据类型 约束, 字段2 数据类型 约束 … ;( 添加字段的时候加上约束 )
- create table 表名 ( 字段1 数据类型 约束 ,字段2 数据类型 约束 … ) ;
create table 表名 ( 字段1 数据类型,字段2 数据类型 … 约束 (字段1 , 字段2 ) ) ;
(建表时添加约束)
删除约束
- alter table 表名 modify 字段名 数据类型 ;( 修改字段属性时不加上约束 )
- alter table 表名 change 旧字段名 新字段名 数据类型 ; ( 修改字段名的时候不加上约束 )