约束
■给约束改为中文名■
alter table 表名 rename constraint 旧名字 to "新名字(中文)";
一.主键约束
1.为什么要用主键约束
(1)防止出现重复数据
(2)检索有利
(3)支持外键
2.主键约束简介
(1)主键列的数据类型不一定是数值型
(2)主键不一定只有一列
(3)大多数时候是单列主键[1.单列主键只需一个搜索条件,2.各个候选码的属性之间不能存在函数依赖]
(4)自增的数值型主键最受欢迎
(5)主键不能为空
3.创建主键约束
(1)创建表的时候定义主键约束 primary key
eg.create table a (a_no number primary key,a_name varchar2(2));
create table a (a_no number,a_name varchar2(20),primary key(a_no,a_name));
(2)查看主键约束
select table_name,constraint_name,constraint_type,status from user_constraints;
除了数据字典user_constraints之外,还可以通过user_cons_columns查看主键被建在那些列上面.
select constraint_name,table_name,column_name from user_cons_columns where constrain_name='约束名';
(3)创建表后,添加主键
alter table add primary key(列1,列2,...);
4.修改主键约束
(1)禁用/启用主键
禁用:alter table 表名 disable primary key;
启用:alter table 表名 enable primary key;
在启用主键约束时,oracle会检查数据是否违反主键约束,如果违反,那么主键的启用也将失败.
(2)重命名主键
alter table 表名 rename constraint 原主键名称 to 新主键名称;
(3)删除主键
alter table 表名 drop constraint 约束名;
5.主键与索引
(1)当oracle创建主键时,会自动创建一个与主键同名的索引.
select table_name,index_name,index_type from user_indexes;
(2)索引列于主键列相同.
查询索引语句:select index_name,table_name,column_name from user_ind_columns;
(3)当用户重命名主键以后,索引并不会随之重命名.
(4)索引会随着主键的删除而被删除.
(5)当oracle创建主键时,会先查看主键列是否创建了索引,如果未创建,则会自动创建;如果已创建,oracle只会创建主键,不会进行索引创建.已存在的索引与主键没连带关系,即删除主键索引依然存在.
二.外键约束
1.为什么要用外键约束
(1)参照完整性
在两个表之间,一个表的记录依附于另一个表的记录而存在,称为表之间的参照完整性
(2)外键的必要性[减少错误]
2.外键约束简介
一个数据表有自己的主键,而向外部其他数据表的引用,称为外键.外键实际银行了对外部引用的限制,必须获得外部数据表的唯一记录.
订单表中的数据,必须依附于客户表产生数据的存在而存在,所以订单表被称为从表,客户表被称为主表.
3.创建外键约束
(1)创建外键约束
alter table 表名 add constraint 约束名 foreign key(外键列名) references 主表(主表主键列);
(2)查看外键信息
select table_name,constraint_name,constraint_type,r_constraint_name from user_constraints;
4.级联更新与级联删除
主表的操作,将连带影响到从表的操作,这就是级联更新与级联删除问题的提出背景.
(1)级联更新
alter table 表名 add constraint 约束名 foreign key(外键列名) references 主表(主表主键列) deferrable initially deferred;
其中,deferrable initially deferred表示新建约束使用了延迟校验机制,默认为即时校验.即时校验是指,当oracle执行了一条sql语句,立即验证这条语句是否仍能保持数据完整性;而延时校验是指,当整个事物结束时,才验证数据完整性.
因此,可以先修改主表数据,然后再修改从表数据,保证二者的统一性,当执行commit以后,事物结束.
更新事物提交时,将验证数据完整性,如果无法通过校验,那么事物回滚.
(2)级联删除
alter table 表名 add constraint 约束名 foreign key(外键列名) references 主表(主表主键列) on delete cascade;
其中,on delete cascade指定外键采用级联删除机制.此处的级联是指,当用户删除主表中的某条记录时,oracle会自动搜索并删除从表中的相关记录[即时删除].
5.外键约束的相关操作
(1)重命名
alter table 表名 rename constraint 原外键名称 to 新外键名称
(2)禁用,启用
alter table 表名 disable/enable constraint 外键名;
(3)不校验已有数据的完整性
alter table 表名 enable novalidate constraint 外交名;
(4)删除外交
alter table 表名 drop constraint 外键名;
三.唯一性约束
1.唯一性约束简介
(1)唯一性约束和主键的相同点
①唯一性约束和主键都可以限制表中记录的唯一性
②唯一性约束和主键都可以建立在单列或列的组合上
(2)唯一性约束和主键的不同点
①表中允许的个数不同.在一个表中,主键是唯一的,而唯一性约束没有数量上的限制
②唯一性约束的列值允许空值
③唯一性约束创建时不会连带创建索引
2.创建唯一性约束
(1)创建唯一性约束
alter table 表名 add constraint 约束名 unique(列名1,列名2,...);
(2)查询唯一性约束的详细信息
select table_name,constraint_name,constraint_type from user_constraints;
唯一性约束的列信息:
select constraint_name,table_name,column_name from user_cons_columns;
3.修改唯一性约束
(1)删除唯一性约束
alter table 表名 drop constraint 约束名;
(2)重命名
altre table 表名 rename constraint 旧名 to 新名;
(3)禁用/启用
alter table 表名 disable/enable constraint 约束名;
4.总结
唯一性约束可以建立在列或列的组合上,可以作为主键约束的补充.最常见的使用场景是:主键建立在与实际业务无关的列上,而业务逻辑上保证记录的唯一性往往使用唯一性约束.
四.检查约束
1.检查约束简介
检查约束的实质是一个布尔表达式,一旦在数据表上创建了检查约束,那么该检查约束将在数据更新时计算布尔表达式的值,如果结果为真,则校验通过,并成功更新数据,否则,oracle将禁止数据的更新操作.
2.创建检查约束
(1)创建检查约束
alter table 表名 add constraint 约束名 check(布尔表达式)
(2)查询检查约束的详细信息
select table_name,constraint_name,constraint_type,search_condition from user_constraints;
五.默认值约束
1.创建默认值约束
(1)创建默认值
alter table 表名 modify 列名 default 默认值;
(2)查看默认值约束信息
select table_name,column_name,data_type,data_length,data_default from user_tab_columns;
2.修改默认值约束
alter table 表名 modify(列1 default 默认值1,列2 default 默认值2);
六.非空约束
1.创建非空约束
(1)创建非空约束
create table 表名 modify (列名 not null);
(2)查看非空约束
select table_name,column_name,data_type,nullable from user_tab_columns;
2.修改非空约束
alter table 表名 modify (列名 null);