约束:///就是强加在表中的规则或者条件,作用让表中的数据更加符合实际要求
constraint
约束的分类
一、按照约束的效果不同分为六种
1.唯一约束
unique
作用:字段中不能出现重复的非空数据,,,///不能添加两个张三但无法限制空值
2.非空约束
not null
作用:该字段中不能出现空值
3.主键约束
primary key
作用:该字段中不能出现空值,也不能出现重复值
4.外键约束
foreign key
作用:字段的取值范围来自另一张表的某字段(某字段表示另一张表主键)
5.检查约束
check
作用:自定义约束内容(类似于where条件)
6.默认值
default
作用:字段中没有插入数据时默认填入的值
二、按照建立时是否跟字段一同声明分两种
1.行级约束
///声明字段与字段属性的同时紧跟其后声明约束
例子:create table 表名(列名1 字段属性 约束,列名2 字段属性)
2.表级约束
////声明字段与字段属性之后,再单独声明约束
create table 表名(列名1 字段属性,列名2 字段属性。。。,声明约束)
注意:
1.同一用户下约束不能重名
2.表删除时,该表的所有约束也会一并删除
3.若表中某字段已经存在了违反约束的数据,则建立约束会失败
4.约束可以在健完表之后再单独建立
5.一个约束可以建立在某一字段上也可以建立在多个字段上
6.唯一约束约束不了空值
7.建立了唯一约束会建立一个同名的唯一索引
创建约束
1.唯一约束unique
a.建立完表之后建立唯一约束
1.行级约束
语法:
alter table 表名 add constraint 约束名 unique (列名。。。。(///作用在哪一个列上))
例子
alter table student add constraint UN_student_sname unique(sanme)
---已经存在两个程梅失败
b.建表的同时建立唯一约束
create table 表名 (列名1 字段属性 unique ,列名2 字段属性 ,列名3 字段属性。。。)
///系统会自动取约束名
自己取名
create table 表名 (列名1 字段属性 constraint 约束名 unique ,列名2 字段属性 ,列名3 字段属性。。。)
2.表级约束
语法:
create table 表名(列名1 字段属性,列名2 字段属性,。。。。
列名n 字段属性,constraint 约束名 unique(列名。。。))
2.非空约束
not null
1.建完表之后建立非空约束
语法
alter table 表名 modify 列名 not null
2.建表的同时建立非空约束
a.行级约束
语法1:
create table 表名 (列名1 字段属性 not null,字段2 字段属性,。。。。。)///约束没有名字
语法2:
create table 表名 (列名1 字段属性 constraint 约束名 not null ,列名2 字段属性。。。)
///自己取了名字但展示在了check中,相当于检查约束
b.表级约束
////非空约束没有表级约束
3.主键约束//不能为空也不能重复
a.建完表之后建立
语法:
alter table 表名 add constraint 约束名 primary key (列名)
b.建完表之后建立主键约束
1.行级约束
create table 表名 (列名1 字段属性 primary key,列名2 字段属性)///系统自动取名
语法2.
create table 表名(列名1 字段属性 constraint pk_zy_zno primary key,列名2 字段属性)
///自己取名
2.表级约束
create table 表名
(列名1 字段属性,列名2 字段属性,constraint 约束名 primary key (列名))
注意:
1.一张表只能有一个主键约束
2.建立了主键约束会建立一个同名的唯一索引
4.外键约束 //////外键约束不了空值,主键没有空值外键可以插入空值,想要删除父表中的主键列
必须先删除子表中的外键数据
foreign key
a.建立完表建立外键约束
语法:
alter table 表名 add constraint 约束名 foreign key(列名)
references 父表名(必须是主键列或者唯一列)
b.建表同时建立外键约束
(1)行级约束
语法:
create table 表名(列名1 字段属性 references 父表名 (必须是主键列或者唯一列),
列名2 字段属性。。。。)
语法2
create table 表名(列名1 字段属性
constraint 约束名 references 父表名(必须是主键列或者唯一列),列名2 字段属性,。。。)
(2)表级约束
语法:
create table 表名(列名1 字段属性,列名2 字段属性 , 。。。。,
constraint 约束名 foreign key (列名) references 父表名(必须是主键列或者唯一列))
注意:
1.外键约束不了空值
2.要想删除父表的主键数据必须先删除子表的外键数据
3.想要修改外键数据,修改后必须在主键数据里
4.外键约束之所以有这么顽固的限制,很少在项目中使用,甚至禁止
5.检查约束
check
a.建表之后建立检查约束
语法:
alter table 表名 add constraint 约束名 check(条件)
/////条件 和where后面一样
例子
alter table zhiyun47 add constraint CH_zhiyun47_zname check (zname='杨雪')
b.建表同时建立检查约束
1.行级约束
语法
create table 表名(列名1 字段属性 check(条件),列名2 字段属性,。。。。。)
语法2
create table 表名(列名1 字段属性 constraint 约束名 check (条件),列名2 字段属性。。。)
2.表级约束
语法
create table 表名(列名1 字段属性,列名2 。。。,constraint 约束名 check (条件))
注意:
1.行级约束条件中只能针对当前列,不能引用其他列
2.条件中不允许写子查询
3.检查约束不能约束空值
6.默认值 default
a.创建完表创建默认值
语法:
alter table 表名 modify 列名 default 值
alter table emp modify job default '扫地'
b.创建表的同时创建默认值
creat table 表名(列名1 字段属性 default 值,列名2 字段属性。。。。)////没有表级约束
约束的删除
1.通用语法
alter table 表名 drop constraint 约束名
2.非空约束删除语法
alter table 表名 modify 列名 null
3.默认值删除
alter table 表名 modify 列名 default 新值/////// 不想让其没有数可以为null
约束注意:;
1.因为约束的存在,数据库会花大量的时间去做数据验证,所以会降低dml执行操作效率
所以不是越多越好
2.使用快捷建表复制出来的表除了非空约束其他约束都会被忽略
--禁用
Alter table 表名 disable constraint约束名 ;
--激活
Alter table 表名 enable constraint约束名 ;