1. 主键创建(primarykey):
alter table tableName add constraint pk_tableName_id primarykey (id);
2. 外键创建(foreignkey):
alter table tableName
add constraint f_tableName_kid foreignkey (kid)
references tableName_source (id) on delete cascade;
3. 条件(check)
alter table tableName add constraint C_tableName_ID check (id>5)
deferrable initially deferred;
4. 修改constraint 的语句
l 先删除,再创建(alter table tableName drop constraint F_TABLENAME_KID;删除)
l 直接修改 alter tabletableName modify constraint F_TABLENAME_KID initially immediate;
l 设置有效无效:alter table tableName disable constraint F_TABLENAME_KID;
alter table tableName enable no validate constraint F_TABLENAME_KID;
5. 说明:
tableName:创建外键的数据表
f_tableName_kid:外键的名称
foreignkey :外键
kid: 创建外键的数据表的字段(关联原始表的某个字段)
tableName_source:原始表的名称
id :原始表的某个字段
u on delete cascade:当父表中的列被删除时,子表中相对应的列也被删除(整个数据条也删除)
u ON DELETE SET NULL:父表中列被删除,子表中相应的列置空(只是数据条的对应的外键列为空值)
u On no action :默认不操作(子表列删除,父表才可以表删除)
Deferrable(约束应用可以延迟): 默认值为not deferrable,字面含义是不可延迟
Deferred(是否进行延迟应用):默认值为不延迟,要和Deferrable一起使用
语句:deferrable initially deferred 为commit前,不会报错。
结论:单独deferrable的含义就是是否允许约束检查延后进行。单独设置deferrable为deferrable之后,约束检查延后是不可以直接使用的,要配合deferred参数,如果该参数是immediate,那么约束还是在DML的时候进行应用。如果deferred参数设置为deferred,约束就是在事务commit提交的时候应用,出现错误就连带回滚rollback整个事务。
语句写法(参考别人)
1.删除约束
alter table table_name drop constraint constraint_name;
2.创建主键
alter table table_name add constraint constraint_name primary key(column_name1,column_name2);
3.创建唯一约束
alter table table_name add constraint constraint_name unique(column_name1,column_name2);
4.创建外键约束
alter table table_name1 add constraint constraint_name foreign key(column_name1) references table_name2(column_name1);
enable/disable:约束/不约束新数据
novalidate/validate:不对/对老数据进行验证
alter table table_name add constraint constraint_name check(column_name like 'B%') enable/disable novalidate/validate;
5.修改约束条件,延时验证,commit时验证
alter table table_name modify constraint constraint_name initially deferred;
6.修改约束条件,立即验证
alter table table_name modify constraint constraint_name initially immediate;
7.设置约束延迟/立即验证
alter session set constraints=deferred/immediate;
8.删除表时删除约束
drop一个有外键的主键表,带cascade constraints参数级联删除
drop table table_name cascade constraints;
9.当truncate外键表时,先将外键设为无效,再truncate;
truncate table table_name;
设约束条件无效
alter table table_name disable constraint constraint_name;
alter table table_name enable novalidate constraint constraint_name;