查看:
select * from user_constraints;
select * from dba_constraints;
约束状态:
1. 针对新数据:disable / enable
2. 针对老数据:validate / novalidate
enable validate:所有数据均需要检查;默认创建Index
disable validate:禁止对该表使用DML
3. 是直接检查还是commit检查:deferrable (alter session set constraint=deferred/nodeferred)
如果表中数据有重复,但是还是希望在上面建主键约束
例如:表名 test;列名:id;id列中有重复值
目标将id建成主键
1. 创建索引:
create index id_in on test(id)
2. 创建主键:
alter table test add constraint id_pk PRIMARY KEY (id) enable novalidate;
之后如果id列修改好了,没有重复值
可以修改约束属性:
alter table test modify constraint id_pk enable validate;
约束检查方式:
DML后马上检查:默认设置
Commit后检查:
1. 创建时添加参数deferrable
例如:alter table test add constraint id_pk primary key(id) deferrable;
2. 设置检查时间
针对constraint
DML 之后查:set constraint id_pk immediate;
commit后查:set constraint id_pk deferred;
针对session
DML 之后查:alter session set constraint=immediate;
commit后查:alter session set constraint=deferred;
约束类型:
1.NOT NULL:该列不能包含空值;使用select 方式创建新表,只有not null约束会自动复制到新表。
写法:alter table DEPT modify DEPTNO not null;
alter table DEPT modify DEPTNO null;
增加新列,有not null属性,必须有default值:alter table test add price number(8,2)default 0 not null;
2.UNIQUE:该列或列组合对于表所有行必须唯一;不能和NOT NULL同时定义,需要逐个添加;该列可以有NULL值
写法:alter table DEPT add constraint dname unique (DNAME,DEPTNO);
alter table DEPT drop constraint dname;
alter table DEPT disable/enable constraint dname;
3.PRIMARY KEY:唯一标示表中的每一行;默认NOT NULL
写法:alter table DEPT_1 add constraint DEPTNO_PK PRIMARY KEY (DEPTNO);
alter table DEPT_1 drop constraint DEPTNO_PK cascade;
alter table DEPT_1 disable constraint DEPTNO_PK cascade;
alter table DEPT_1 enable constraint DEPTNO_PK cascade;
4.FOREIGN KEY:该列和被引用表的列之间建立关系;
特点:
1. 外键必须建立在有主键约束或者唯一约束的列上;
2. 默认不可以删改,可通过添加属性来处理;
3. 建议加上Index,提升性能;
4. 该列可以有NULL值
写法:alter table dept_1 add constraint deptno_fk FOREIGN KEY (DEPTNO) REFERENCES EMP(EMP_ID);
alter table dept_1 drop constraint deptno_fk;
alter table dept_1 disable constraint deptno_fk;
alter table dept_1 enable constraint deptno_fk;
5.CHECK:指定条件必须为真;
写法:alter table dept add constraint abc check (dname is not null);
alter table dept drop constraint abc;
alter table dept disable constraint abc;
alter table dept enable constraint abc;
Top-N 例子
SELECT ROWNUM as SENIOR, E.last_name, E.hire_date
FROM (SELECT last_name,hire_date FROM employees ORDER BY hire_date)E
WHERE rownum <=4
约束关联:
当主键被disable后,与他相关的外键也随之失效;
当主键被重新enable后,与他相关的外键需要手工enable,才能重新生效。