学习内容
|
1 |
什么是数据的完整性 所谓的数据的完整性就是在数据库中符合公司商业规则的有效数据。 |
|
2 |
有哪几种主要的方法来维护数据的完整性 oracle的完整性约束---------强加在表上的规则或条件。------------,oracle自带的,可靠性和效率都很好 数据库触发器、应用程序代码------------都需要依赖程序员编码,程序员的水平决定系统的可靠性、安全性和效率。 |
|
3 |
oralce系统提供了几种约束 非空( NOT NULL )约束:所定义的列决不能为空 唯一(UNIQUE)约束:在表中的每一行中所定义的这个列或者这些列的值都不能相同 主键(PRIMARY KRY)约束:指明一列或几列的组合为该键的主键。主键唯一的标识表中的每一行,并且主键不能包括空值。 外键(FOREIGN KEY)约束:指明一列或几列的组合为外键以维护从表(child table)和主表(parent table)之间的引用完整性(referebtial integrity) 条件(check)约束:表中每一行都要满足该约束条件。 |
|
4 |
完整性约束可能所处的4中状态 DISABLE NOVALIDATE(禁止而无效):不做任何约束所定义的检查。 DISABLE VALIDATE(禁止而有效):表中由约束所限制的列不能做任何的修改。 ENABLE NOVALIDATE(激活而无效):新的违反约束的数据不能输入到表中。 ENABLE VALIDATE(激活而有效):任何违反约束的数据行都不能插入到表中。 当一个约束从禁止(disabled)状态变为ENABLE VALIDATE时,表中所有的数据都会被上锁以检验数据的完整性。这可能会造成DML操作的等待,因此建议:为了系统的效率,在生成(商业)数据库系统上最好不要在繁忙时间将约束从禁止状态变为ENABLE VALIDATE. 但是在繁忙期间可以先将约束从禁止状态变为ENABLE NOVALIDATE状态,之后等系统平静下来,再将约束改为ENABLE VALIDATE状态。 |
|
5 |
延迟性约束和非延迟性约束 非延迟性约束也叫立即性(immediate)约束:要在一个DML语句结束时进行数据完整性的检查。如果有效数据违反了约束条件,该语句将被回滚。 延迟性约束:仅在每一个事物(transaction)提交时进行数据完整性的检查。如果有数据违反了约束条件,整个事物将被回滚。 |
|
6 |
怎样定义延迟性约束: 延迟性约束:仅在每一个事物(transaction)提交时进行数据完整性的检查。如果有数据违反了约束条件,整个事物将被回滚。 下面做一些实验进行演示: 首先从数据字典dba_contraints中获取scott用户所拥有的约束信息。 SQL> col CONSTRAINT_NAME for a16; SQL> col TABLE_NAME for a12; SQL> select CONSTRAINT_NAME,TABLE_NAME, CONSTRAINT_TYPE,STATUS, DEFERRABLE,DEFERRED,VALIDATED 2 from dba_constraints 3 where owner='SCOTT';
CONSTRAINT_NAME TABLE_NAME C STATUS DEFERRABLE DEFERRED VALIDATED ---------------- ------------ - -------- -------------- --------- ------------- FK_DEPTNO EMP R ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED PK_DEPT DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED PK_EMP EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED C-----------check,条件约束和非空约束 R-----------referential integrity,外键 P-----------primary key,主键
|
|
7 |
怎样改变延迟状态
SQL> set constraints scott.fk_deptno,scott.pk_emp immediate; set constraints scott.fk_deptno,scott.pk_emp immediate * ERROR at line 1: ORA-02447: cannot defer a constraint that is not deferrable SQL> set constraints scott.fk_deptno,scott.pk_emp deferred; set constraints scott.fk_deptno,scott.pk_emp deferred * ERROR at line 1: ORA-02447: cannot defer a constraint that is not deferrable 由以上的错误信息提示可以得到:不能修改任何非延迟性约束的延迟状态。 |
|
8 |
定义和维护约束时应该遵循的原则 对于主键和唯一键: 1、利用USING INDEX子句将约束的索引放在(与表)不同的表空间中。 2、如果经常有大规模数据的装入,使用非唯一索引。 对于自引用的外键: 1、在初始装入数据之后再定义或者开启外键。 2、延迟约束的检查。 |
|
9 |
关闭和开启约束的操作 1、首先在scott用户下创建一个表person; SQL> create table person 2 (personid number(7) 3 ,name varchar2(20) 4 ,birthday varchar2(20) 5 ,edulevel varchar2(20) 6 ,passaway number(20));
Table created. 2、向SCOTT用户下的person(人物)表插入一条名为君晓的记录,该记录的personid(主键)为001; SQL> insert into person 2 (personid,name,birthday,edulevel ,passaway ) 3 values('001','junxiao',null,null,null);
1 row created. 3、验证一下是否插入名为junxiao的一条记录 SQL> col name for a10; SQL> select * from person;
PERSONID NAME BIRTHDAY EDULEVEL PASSAWAY ---------- ---------- -------------------- -------------------- ---------- 1 junxiao 4、接下来载使用DML语句向person表插入一条名为xiaoxiao的记录,该记录的personid(主键)也为001; SQL> insert into person 2 (personid,name,birthday,edulevel,passaway) 3 values ('001','xiaoxiao',null,null,null);
1 row created. 竟然插入成功了,既然已经在personid一列加入了主键约束,为什么还是能插入主键相同的(都为001)两条记录呢?其实这是因为这个主键约束时一个延迟性约束。 5、接下来我们提交所做的插入命令,看会怎样? 提交的话应该会失败的,因为他违反了主键约束,但是我的不知道什么地方出问题了,居然提交成功了。 |
|
10 |
怎样将一个约束重新命名
SQL> alter table scott.emp 2 rename constraint PK_EMP 3 to emp_empno_pk;
Table altered. SQL> select CONSTRAINT_NAME,TABLE_NAME,CONSTRAINT_TYPE,STATUS,DEFERRABLE, DEFERRED,VALIDATED 2 from dba_constraints 3 where owner='SCOTT';
CONSTRAINT_NAME TABLE_NAME C STATUS DEFERRABLE DEFERRED VALIDATED ---------------- ------------ - -------- -------------- --------- ------------- FK_DEPTNO EMP R ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED PK_DEPT DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED EMP_EMPNO_PK EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
|
|
11 |
怎样删除一个约束 SQL> alter table scott.emp 2 drop constraint FK_DEPTNO;
Table altered.
SQL> select CONSTRAINT_NAME,TABLE_NAME,CONSTRAINT_TYPE,STATUS,DEFERRABLE, DEFERRED,VALIDATED 2 from dba_constraints 3 where owner='SCOTT';
CONSTRAINT_NAME TABLE_NAME C STATUS DEFERRABLE DEFERRED VALIDATED ---------------- ------------ - -------- -------------- --------- ------------- PK_DEPT DEPT P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED EMP_EMPNO_PK EMP P ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
|
问题:
开启和关闭约束的操作过程出现了问题。同时插入了一条personid为001的三条记录,结果都能提交成功,按照原理的话不应该是提交失败的吗,因为会违反主键约束的!可能我是哪做错了吧,完了继续研究一下。
总结:
总的一章学习下来,主要就是创建约束,修改约束名,删除约束之类的,感觉这一章的内容更加偏向开发层面。可能平时做的比较少,学的稍微有点慢,而且还会在概念上纠结好久。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30606702/viewspace-2120514/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30606702/viewspace-2120514/

被折叠的 条评论
为什么被折叠?



