`
xiaolong0211
  • 浏览: 336694 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

数据库中三大问题:约束、CASE语句和文件(转)

阅读更多

本文用实例方式讲述了关于约束、CASE语句和文件三大问题。

约束

“定义为可延迟(deferrable)”的约束能指定为:

 

1. initially immediate(初始化即时执行)或

2. initially deferred(初始化延迟执行)。

 

知道什么是延迟约束,但不明白什么叫“初始化即时执行的可延迟约束”和“初始化延迟执行的可延迟约束”。请解释二者的差别。更有,这些约束有什么用途?这是通常容易混淆的问题。我希望下面的例子能解释清晰。初始化即时执行/延迟执行规定了在默认情况下应该怎么执行约束:

 

初始化即时执行:在每条语句执行结束时检验约束。

 

初始化延迟执行:直等到事务完成后(或调用set constraint immediate语句时)才检验约束。

 

通过代码分析两者不同:

 

SQL> create table t
            2 ( x int constraint
            check_x check ( x > 0 )
            deferrable
            initially immediate,
            3y int constraint
            check_y check ( y > 0 )
            deferrable
            initially deferred
            4 )
            5 /
            Table created.
            SQL> insert into t values ( 1,1 );
            1 row created.
            SQL> commit;
            Commit complete.

 

所以,当两个约束同时满足时才能正确无误地插入行。不过,如果我试图插入违反CHECK_X约束(初始化即时执行的约束)的行,则系统会即时检验约束,并得到下面的结果:

 

SQL> insert into t values ( -1,1);
            insert into t values ( -1,1)
            *
            ERROR at line 1:
            ORA-02290: check constraint
            (OPS$TKYTE.CHECK_X) violated

由于CHECK_X是可延迟但初始化为即时执行的约束,所以这一行即时被拒绝了。而CHECK_Y则不同,他不仅是可延迟的,而且初始化为延迟执行,这就意味着直到我用COMMIT命令提交事务或将约束状态设置为即时执行时才检验约束。

 

SQL> insert into t values ( 1,-1);
            1 row created.

目前他是成功的(总之到目前为止是成功的)。我将约束检验延迟到了执行COMMIT的时候:

 

SQL> commit;
            commit
            *
            ERROR at line 1:
            ORA-02091: transaction rolled back
            ORA-02290: check constraint
            (OPS$TKYTE.CHECK_Y) violated

此时数据库将事务回滚,因为违反约束导致了COMMIT语句的失败。这些语句说明了初始化即时执行和初始化延迟执行约束之间的差别。initially(初始化)部分指定Oracle什么时候会进行默认的约束检验--是在语句结束时[immediate(即时执行)],还是在事务结束时[deferred(延迟执行)]。我还要说明deferred(可延迟)子句有什么用。我能发出命令,让所有可延迟的约束变为延迟执行的。注意,你也能对一个约束使用该命令;你不必让所有可延迟的约束都变为延迟执行的:

 

SQL> set constraints all deferred;
            Constraint set.
            SQL> insert into t values ( -1,1);
            1 row created.

 

由于将初始化即时执行的约束设置为延迟执行的模式,这个语句似乎执行成功;不过,当我用COMMIT语句提交事务时,看一下会发生什么:

 

SQL> commit;
            commit
            *
            ERROR at line 1:
            ORA-02091: transaction rolled back
            ORA-02290: check constraint
            (OPS$TKYTE.CHECK_X) violated

 

事务提交失败并回滚,因为在COMMIT语句之后对约束进行了检验。相反,我能将初始化为延迟执行的约束变为“即时”执行的约束:

 

SQL> set constraints all immediate;
            Constraint set.
            SQL> insert into t values ( 1,-1);
            insert into t values ( 1,-1)
            *
            ERROR at line 1:
            ORA-02290: check constraint
            (OPS$TKYTE.CHECK_Y) violated

前面在我提交前能执行的语句目前即时出了问题。因为我手动修改了默认的约束模式。

 

延迟约束用处

 

他主要用于物化视图(快照)。这些视图会使用延迟约束来进行视图刷新。在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束。但到执行COMMIT时,数据完整性就没问题了,而且能满足约束。没有延迟约束,物化视图的约束可能会使刷新过程不能成功进行。

 

使用延迟约束的另一个普遍原因是,当预测是否需要更新父/子关系中的主键时,他有助于级联更新。如果你将外键设为可延迟、但初始化为即时执行,那么你就能将所有约束设置为可延迟。将父键更新为一个新值--至此子关系的完整性约束不会被验证。将子外键更新为这个新值。

 

COMMIT:只要所有受更新影响的子记录都指向现有的父记录,这条命令就能成功执行。

 

此外,你能在各种多语句事务中使用延迟约束,这些事务在处理的过程中需要暂时破坏完整性,但最后他们都会物归原样。

Case语句

怎么计算时间

你是怎么计算asktom.oracle.com第一页中AGE列显示的时间的?我之所以问这个问题是因为我看到他有多种格式,如9个月3小时;2.3年;19个小时;等等。我是Oracle新手,想知道你们在使用哪种日期计算法。

 

非常好用的CASE语句:

 

Select
            case
            when sysdate-timestamp < 1/24
            then round(24*60*(sysdate-timestamp))
            || ’ minutes old ’
            when sysdate-timestamp < 1
            then round(24*(sysdate-timestamp))
            || ’ hours old ’
            when sysdate-timestamp < 14
            then trunc(sysdate-timestamp)
            || ’ days old ’
            when sysdate-timestamp < 60
            then trunc((sysdate-timestamp)/7)
            || ’ weeks old ’
            when sysdate-timestamp < 365
            then round(months_between
            (sysdate,timestamp))
            || ’ months old ’
            else round(months_between
            (sysdate,timestamp)/12,1)
            || ’ years old ’
            end age, ...

如果你想在Oracle8i的PL/SQL中使用CASE语句,则会出现一个错误消息,因为PL/SQL语法分析程式不识别CASE语句。(请注意,在Oracle9i不存在这样的问题。)为了避开Oracle8i的限制,你能将CASE语句隐藏在视图当中,并用PL/SQL来查询视图。使用嵌套的DECODE语句来代替CASE语句。

 

网站公开下面这段代码:

 

decode(sign(sysdate-timestamp-1/24),-1,
            round(24*60*(sysdate-timestamp))
            || ’ minutes old ’,
            decode(sign(sysdate-timestamp - 1), -1,
            round(24*(sysdate-timestamp))
            || ’ hours old ’,
            decode(sign(sysdate-timestamp-14),-1,
            trunc(sysdate-timestamp)
            || ’ days old ’,
            decode(sign(sysdate-timestamp-60),-1,
            trunc((sysdate-timestamp)/7)
            || ’ weeks old ’,
            decode(sign(sysdate-timestamp-365),-1,
            round(months_between
            (sysdate,timestamp))
            || ’ months old ’,
            round(months_between
            (sysdate,timestamp)/12,
            1)
            || ’ years old ’
            ))))) age

他和CASE语句的功能完全相同,只是不太明显。

 

文件

我正在考虑为一个应用程式设计些选项,利用他用户能上传和存储可供他人下载的文件。文件能是平均大小为150Kb的Microsoft Word文件。最初需要(从CD)移植18000到20000个文件,当使用该应用程式时存储数量会增加到大约25000个文件。浏览器前端是用于上传和下载的PL/SQL插件(PL/SQL cartridge)页面。一开始,会有400到500人几乎同时访问该应用程式,两周内每天将有300人访问(分散访问)。 文件本身在数据库中作为BLOB存储。

 

从使用方面考虑,你觉得这样的选项好吗?他会过多占用系统全局区(SGA)吗?考虑到应用程式的需求及前端(基于浏览器),除了保存为BLOB,更有没有其他选择,如文件系统?

 

我什么都存在数据库里。就是这样。如果数据就是你的一切,无论他们有什么样的值,事实上都要放到数据库中,在那里数据能得到专业化的管理、备份,恢复而且安全。除了这些实实在在的好处,你还能索引及搜索文件。(诚然,用文件系统也能做这些,但在索引和文件之间不存在完整性。)在数据库中,你能转换文件格式(例如,上传一个DOC文件,而显示为HTML格式)。你的数据是完全集成的、安全的、有备份的而且随时供你使用。

 

在Oracle公司内部,我们将一个几千G字节的数据库作为整个公司的一个单一的文件服务器。公司所有文件都存在那里,存在这样一个单一的地方,能对这些文件进行备份、搜索、建立索引和访问。在常规的文件系统中管理成千上万的文件是不可能的。

  • http://www.sudu.cn/info/html/edu/20080402/257105.html

    以上内容由 华夏名网 搜集整理,如转载请注明原文出处,并保留这一部分内容。

  • 分享到:
    评论

    相关推荐

      数据库中三大问题约束、CASE语句和文件.doc

      在数据库管理中,三大问题约束、CASE语句和文件是核心概念,对于数据的完整性和业务逻辑的实现至关重要。本篇文章主要探讨了约束,特别是可延迟约束的两种类型——初始化立即执行和初始化延迟执行,以及它们在实际...

      MySQL从入门到实战学习教程练习题及参考答案.docx

      MySQL 是一种开源的关系数据库管理系统,它广泛应用于各种网站和应用程序中。掌握 MySQL 是每个软件开发者和数据库管理员不可或缺的技能。本资源提供了一个完整的 MySQL 学习教程,涵盖了从入门到实战的所有方面,...

      Oracle数据库基础教程:入门其实很简单

      - 数据库的发展历程:从早期的文件系统到关系型数据库的发展历程。 - Oracle数据库的地位:作为目前最流行的客户/服务器数据库之一,Oracle在全球范围内的广泛应用。 2. **实体-联系模型(E-R Model)**: - ...

      SQL_Sever数据库语句大全.zip

      SQL_Sever数据库语句大全.zip 具体SQL语句实例如下 获取当前日期的星期 获取某个字段排序的行号 获取数据库所有表和视图的信息 获取月份的月初月末时间 禁用启用触发器 判断是否存在视图(创建视图) 启用服务器...

      数据库:函数 约束 的简单介绍

      数据库中的函数和约束是数据库管理系统(DBMS)中两个重要的概念,它们对于数据的管理和维护起着至关重要的作用。 函数是预定义的可重用代码片段,用于执行特定任务,如字符串处理、数值运算或日期操作。在描述中...

      Oracle数据库常用sql语句的分类和常用函数.docx

      根据提供的文档信息,本文将详细解析Oracle数据库中的关键SQL语句分类、常用SQL语句以及Oracle函数的应用场景。此外,还将简要介绍Oracle数据库的一些基本管理命令,如启动与关闭服务、用户管理等。 ### 一、Oracle...

      数据库语句大全,留着备忘啊

      数据库是存储和管理数据的核心工具,SQL(Structured Query Language)是用于操作数据库的语言,包括创建、查询、更新和删除数据等操作。以下是一份全面的SQL知识点概览,旨在帮助你理解和掌握数据库语句的使用。 1...

      数据库SQL语句集锦

      数据库SQL语句是数据库管理系统(DBMS)与用户或应用程序之间的通信语言,用于管理数据库中的数据。以下是对给定文件中列出的SQL语句及其功能的详细解释: ### 数据操作 1. **SELECT**:从数据库表中检索数据行和...

      SQL数据库语句大全大全

      - **CASE**:类似switch-case语句,根据不同条件选择执行不同的分支。 - **WHILE**、**CONTINUE**、**BREAK**:循环控制,用于重复执行一段代码,直到满足特定条件。 以上就是SQL数据库语句的基本功能和用法,...

      数据库case study

      在本案例研究中,我们将探讨如何使用SQL和Oracle数据库来设计和管理TinyVideo电影租赁公司的数据库系统。这个系统需要跟踪会员对电影的租赁情况。以下是根据提供的ERD(实体关系图)和关系模式来解析的关键知识点: ...

      优化MySchool数据库设计总结

      5. **数据库设计规范**:遵循数据库设计的三大范式: - **第一范式(1NF)**:确保每一列都具有原子性,即不可再分的最小数据单元。 - **第二范式(2NF)**:确保表中非主键列完全依赖于主键,消除部分依赖。 - *...

      数据库应用总复习-PPT课件.ppt

      * T-SQL语言的控制语句:IF语句、LOOP语句、CASE语句 单项选择题 1. SQL Server安装程序创建几个系统数据库,下列哪个不是系统数据库( )。 A、master B、model C、pubs D、msdb 答案:C、pubs 2. 下列...

      50个常用sql语句.rar

      22. **CASE表达式**:允许在SQL语句中进行条件判断,返回不同的值。 23. **LIKE操作符**:在WHERE子句中用于模糊匹配,常与通配符%和_一起使用。 24. **IN操作符**:用于检查某值是否在给定的列表中。 25. **...

      SQL语句英文翻译成中文

      SQL,全称Structured Query Language,是用于管理和处理关系数据库的标准语言。它分为多个部分,包括数据操作、数据定义、数据控制以及程序化SQL等。 **数据操作:** 1. **SELECT** - 用于从数据库中检索数据,可以...

      数据库OCA考试资源

      10. **故障诊断与解决**:学习如何通过日志文件分析问题,使用Oracle的诊断工具(如 trace 文件、报警日志)定位和解决问题。 11. **数据库维护**:理解数据库的日常维护工作,如表空间管理、数据文件的增加与移动...

      达梦数据库使用,包括安装,配置,适配Mysql、备份与还原

      接着,打开数据库配置助手创建数据库实例,建议把页大小设置大一点,以免记录超过页大小需要设置表的开启长记录设置。 对于 Docker 部署,需要编写 Compose 配置文件,版本为 3。服务 dmdbms 的镜像为 dm8_single:...

      SQL数据库语句大全

      SQL(Structured Query Language)是用于管理和操作关系数据库的语言。它提供了多种功能,涵盖了数据操作、数据定义、数据控制以及程序化SQL等方面。以下是对这些功能的详细解释: 1. **数据操作** - **SELECT**:...

    Global site tag (gtag.js) - Google Analytics