我的Oracle 9i学习日志(17)-- 维护数据完整性.a

简介:
数据完整性保证方法:

01
•  应用程序代码
•  数据库触发器
•  声明完整性约束
具体使用上述哪种方法映射业务规则是设计时应考虑的问题。而数据库管理员主要关心的是实施设计人员选择的方法,并在完整性需求和性能要求之间取得平衡。
应用程序代码既可作为数据库中的存储过程实现,也可作为在客户端上运行的应用程序实现。
数据库触发器是 PL/SQL  程序,在表上发生事件(如插入或更新列)时执行。可以启用或禁用触发器,即可以设置触发器在事件发生时执行,或者将触发器设置为不执行(即使已定义)。通常情况下,创建数据库触发器只是为了强制应用不能定义为完整性约束的复杂业务规则。
完整性约束是执行业务规则的首选机制,这是因为它可以:
•  改善性能
•  易于声明和修改,不需要进行大量编码
•  集中管理规则
•  使用灵活(启用或禁用)
•  在数据字典中完全文档化
约束类型:

2
NOT NULL:
在列级别定义。
创建表时定义:
SQL> create table dingdan(
 2 order_num number(4) constraint nn_order_num not null,
 3 order_date date not null,
 4 product_id number(3));
 
表已创建。
 
SQL> desc dingdan
  名称                                        是否为空 类型
 ----------------------------------------- -------- ----------------------------
 
 ORDER_NUM                                 NOT NULL NUMBER(4)
 ORDER_DATE                                NOT NULL DATE
 PRODUCT_ID                                         NUMBER(3)
创建后修改:
SQL> alter table dingdan modify order_date null;
 
表已更改。
 
SQL> desc dingdan
  名称                                       是否为空类型
 ----------------------------------------- -------- ----------------------------
 
 ORDER_NUM                                 NOT NULL NUMBER(4)
 ORDER_DATE                                         DATE
 PRODUCT_ID                                         NUMBER(3)
 
SQL> alter table dingdan modify product_id not null;
 
表已更改。
 
SQL> desc dingdan;
  名称                                        是否为空 类型
 ----------------------------------------- -------- ----------------------------
 
 ORDER_NUM                                 NOT NULL NUMBER(4)
 ORDER_DATE                                         DATE
 PRODUCT_ID                                NOT NULL NUMBER(3)
CHECK:
可以在列或表级别定义。
•check 表达式中可以引用同一行的其他列值作为参考条件值,但不能做查询。
•Environment function such as SYSDATE,USER,USERENV,UID,and pseudo-columns such as ROWNUM,CURRVAL,NEXTVAL, or LEVEL cannot be used to evaluate the check condition.
一列可以定义多个 check 约束。
SQL> create table bonus(
 2 emp_id varchar2(40) not null,
 3 salary number(9,2),
 4 bonus number(9,2),
 5 constraint ck_bonus check(bonus>0));
SQL> alter table bonus add constraint ck_bonus2 check (bonus<salary and bonus>=0);
唯一性约束:
在列级别只能约束一列,组合键的唯一性约束只能在表级别定义。
在创建唯一性约束以后, Oracle 自动创建一个与被指定的列的唯一性约束索引。如果原来这列定义了索引则使用原来的索引,如果索引时非唯一性的那么必须不能包含相同的键值。在插入操作时先扫描索引。不能显式地 drop 索引,除非先 drop 相应的约束。其他管理方式与普通索引一样。
唯一性约束允许列中有多个 null 值,因为 null 值不存储在索引中,所以当插入 null 值时因在索引中找不到而被允许插入。
在唯一性约束中允许 null 值存在。
在创建唯一性约束键值时,隐式生成的索引可以指定其存储参数,如果没有指定则使用 tablespace 的存储参数。也可以使用 LOGGING NOSORT 语句。索引可以是本地或全局分区索引。
 
SQL> desc bonus;
  名称                                       是否为空类型
 ----------------------------------------- -------- ----------------------------
 
 EMP_ID                                    NOT NULL VARCHAR2(40)
 SALARY                                             NUMBER(9,2)
 BONUS                                              NUMBER(9,2)
 DEPT                                               VARCHAR2(10)
 
SQL> alter table bonus add constraint uq_emp_id unique (dept,emp_id)
 2 using index tablespace indx
 3 storage(initial 32k next 32k pctincrease 0);
 
表已更改。
 
SQL> insert into bonus values(2,1200,500,'sale');
 
已创建  1  行。
 
SQL> commit;
 
提交完成。
 
SQL> select * from bonus;
 
EMP_ID                             SALARY      BONUS DEPT
------------------------------ ---------- ---------- --------------------
1                                    1000        500 sale
2                                    1200        500 sale
 
SQL> insert into bonus values(1,1200,500,'sale');
insert into bonus values(1,1200,500,'sale')
*
ERROR  位于第  1  :
ORA-00001: unique constraint (LUO.UQ_EMP_ID) violated
 
 
SQL> insert into bonus values(1,1200,500,'telch');
 
已创建  1  行。
 
SQL> select * from bonus;
 
EMP_ID                             SALARY      BONUS DEPT
------------------------------ ---------- ---------- --------------------
1                                    1200        500 telch
1                                    1000        500 sale
2                                    1200        500 sale
 
SQL> rollback;
 
回退已完成。
 
SQL> select object_name,object_type from user_objects;
 
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
T                              TABLE
T_ID_IDX                       INDEX
UQ_EMP_ID                      INDEX
 
已选择 7 行。
 
SQL> drop index uq_emp_id;
drop index uq_emp_id
           *
ERROR  位于第  1  :
ORA-02429: cannot drop index used for enforcement of unique/primary key
# 如果要 drop 索引必须先 drop 相应的约束。
SQL> create index bonus_id_idx on bonus(emp_id);
 
索引已创建。
 
SQL> create index bonus_id_idx on bonus(emp_id,dept);
create index bonus_id_idx on bonus(emp_id,dept)
             *
ERROR  位于第  1  :
ORA-00955: name is already used by an existing object
 
SQL> select object_name,object_type from user_objects;
 
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
BONUS_ID_IDX                   INDEX
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
T                              TABLE
T_ID_IDX                       INDEX
UQ_EMP_ID                      INDEX
 
已选择 8 行。
 
SQL> drop index bonus_id_idx;
 
索引已丢弃。
主键约束:
特性: Unique+not null
一个表只能有一个主键。
创建一个 Unique+not null 的索引,其他特性与 unique 约束特性相同。
 
SQL> create table t(id number primary key,name varchar2(10));
 
表已创建。
 
SQL> select object_name,object_type from user_objects;
 
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
SYS_C002767                    INDEX
T                              TABLE
UQ_EMP_ID                      INDEX
 
已选择 7 行。
 
SQL> create table tt(id number,pid number,name varchar2(10),
 2 constraint pk_id primary key(id,pid));
 
表已创建。
 
SQL> select object_name,object_type from user_objects;
 
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
PK_ID                          INDEX
SYS_C002767                    INDEX
                             TABLE
TT                             TABLE
UQ_EMP_ID                      INDEX
 
已选择 9 行。
 
外键约束:

3
在表级别可以定义多个键值,父表中的列要是主键列或唯一约束列。
外键和被引用键所在列可以是同一张表里的不同列即父表与子表是同一个表,如图 4
外键允许为 null

4
当父表中被引用的列中某行被删除时子表的相应动作:
Delete no action :缺省,父表中被引用的列的行值将不允许被删除或修改。
Delete cascade :父表中某行被删除后,子表中相应的所有项也会被删除。
Delete set null :父表中某行被删除后,子表中相应的所有项被设置为 null
举例:
Alter table city add constraint fk_state foreign key (country_code,state_code) on delete cascade;
Alter table city add constraint fk_state foreign key (country_code,state_code) on delete set null;
实验:
SQL> alter table orders add constraint fk_cust foreign key(cust_code)
 2 references customers(cust_code) on delete cascade;
references customers(cust_code) on delete cascade
                     *
ERROR  位于第  2  :
ORA-02270: no matching unique or primary key for this column-list
 
 
SQL> alter table customers add constraint pk_cust primary key(cust_code);
 
表已更改。
 
SQL> alter table orders add constraint fk_cust foreign key (cust_code)
 2 references customers(cust_code)
 3 on delete cascade;
 
表已更改。
 
SQL> select * from customers;
 
CUST_C NAME                                               REGION
------ -------------------------------------------------- ----------
A01    TKB SPORT SHOP                                     West
A02    VOLLYRITE                                          North
A03    JUST TENNIS                                        North
A04    EVERY MOUNTAIN                                     South
A05    SHAPE UP                                           South
A06    SHAPE UP                                           West
A07    WOMENS SPORTS                                     South
A08    NORTH WOODS HEALTH AND FITNESS SUPPLY CENTER       East
 
已选择 8 行。
 
SQL> select * from orders;
 
    ORD_ID ORD_DATE   CUST_C DATE_OF_DE PRODUCT_ID
---------- ---------- ------ ---------- --------------------
      610 11-11-97 A01
       611 15-11-97 A02
       612 19-11-97 A04
       601 05-3 -97 A06
       602 09-4 -97 A02
       600 05-3 -97 A03
       604 19-4 -97 A06
       605 18-5 -97 A06
       607 22-5 -97 A04
       608 29-5 -97 A04
       603 09-4 -97 A02
       613 06-12-97 A08
       614 06-12-97 A02
       616 08-12 -97 A03
       619 27-12-97 A04
       617 10-12-97 A05
       615 06-12-97 A07
       618 20-12-97 A02
 
已选择 18
 
SQL> delete from customers where cust_code='A03';
 
已删除  1  行。
 
SQL> select * from orders;
 
    ORD_ID ORD_DATE   CUST_C DATE_OF_DE PRODUCT_ID
---------- ---------- ------ ---------- --------------------
       610 11-11-97 A01
       611 15-11-97 A02
       612 19-11-97 A04
       601 05-3 -97 A06
       602 09-4 -97 A02
       604 19-4 -97 A06
       605 18-5 -97 A06
       607 22-5 -97 A04
       608 29-5 -97 A04
       603 09-4 -97 A02
       613 06-12-97 A08
       614 06-12-97 A02
       619 27-12-97 A04
       617 10-12-97 A05
       615 06-12-97 A07
       618 20-12-97 A02
 
已选择 16 行。









本文转自 d185740815 51CTO博客,原文链接:http://blog.51cto.com/luotaoyang/293801,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
1天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs &lt;container_name&gt;` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
4 0
|
6天前
|
Oracle 安全 关系型数据库
Oracle数据守卫(DG):数据的“守护者”与“时光机”
【4月更文挑战第19天】Oracle Data Guard保障数据安全,通过实时维护备库实现故障切换,保证业务连续性。它使用日志传输和应用保持数据同步,如同“时光机”,借助闪回技术能恢复误操作数据。此外,它还提供数据压缩、加密和故障转移等功能,提升数据库安全性与性能。作为数据管理员,理解并善用Data Guard是确保企业数据安全的关键。
|
6天前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
6天前
|
存储 Oracle 关系型数据库
Oracle 12c的多重索引:数据的“多维导航仪”
【4月更文挑战第19天】Oracle 12c的多重索引提升数据查询效率,如同多维导航仪。在同一表上创建针对不同列的多个索引,加速检索过程。虽然过多索引会增加存储和维护成本,但合理选择和使用索引策略,结合位图、函数索引等高级特性,能优化查询,应对复杂场景。数据管理员应善用这些工具,根据需求进行索引管理,支持企业数据分析。
|
6天前
|
存储 Oracle 数据管理
Oracle 12c的自动数据优化(ADO)与热图:数据管理的“瘦身”与“透视”艺术
【4月更文挑战第19天】Oracle 12c的ADO和热图技术革新数据管理。ADO智能清理无用数据,优化存储,提升查询速度,实现数据&quot;瘦身&quot;;热图则以直观的视觉表示展示数据分布和状态,助力识别性能瓶颈,犹如数据的&quot;透视&quot;工具。这两项技术结合,强化数据管理,为企业业务发展保驾护航。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
6天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
6天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。

热门文章

最新文章

推荐镜像

更多