收藏 分享(赏)

《Oracle+PLSQL从入门到精通》第5、6章.doc

上传人:ysd1539 文档编号:7348060 上传时间:2019-05-15 格式:DOC 页数:86 大小:1.24MB
下载 相关 举报
《Oracle+PLSQL从入门到精通》第5、6章.doc_第1页
第1页 / 共86页
《Oracle+PLSQL从入门到精通》第5、6章.doc_第2页
第2页 / 共86页
《Oracle+PLSQL从入门到精通》第5、6章.doc_第3页
第3页 / 共86页
《Oracle+PLSQL从入门到精通》第5、6章.doc_第4页
第4页 / 共86页
《Oracle+PLSQL从入门到精通》第5、6章.doc_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、程序员典藏大系Oracle PL/SQL 从入门到从入门到精通精通丁士锋 等编著清 华 大 学 出 版 社北 京内 容 简 介Oracle PL/SQL 从入门到精通 3本书以面向应用为原则,深入浅出地介绍了 Oracle 平台上使用 PL/SQL 语言进行数据库开发的技术。通过大量的示例,详细介绍了 PL/SQL 的语言特性、使用技巧,同时配以两个在实际工作中的案例深入地剖析了使用 PL/SQL 进行 Oracle 开发的方方面面。本书附带 1 张 DVD 光盘,内容为作者为本书录制的全程语音教学视频及本书所涉及的源代码。本书分为 5 大篇共 20 章。涵盖的内容主要有 PL/SQL 语言基

2、础、开发环境、变量与类型、控制语句、数据表的管理和查询、数据表的操纵、使用 PL/SQL 的记录与集合、各种内置函数、游标、事务处理、异常处理、子程序、包、面向对象的开发等技术点。通过示例性的代码,由浅入深,详细介绍了每一个技术要点在实际工作中的应用,对各种技术要点的应用场合进行了细致的分析。本书适合于使用 PL/SQL 进行应用程序开发的人员、对软件开发有兴趣的学生及爱好者阅读和参考;对数据库管理员、企业 IT 运维人员也具有很强的指导作用。本书封面贴有清华大学出版社防伪标签,无标签者不得销售。版权所有,侵权必究。侵权举报电话:010-62782989 13701121933图书在版编目(C

3、IP)数据Oracle PL/SQL 从入门到精通 / 丁士锋等编著. 北京:清华大学出版社,2012.6ISBN 978-7-302-28103-0 . O . 丁 . 关系数据库-数据库管理系统,Oracle . TP311.138中国版本图书馆 CIP 数据核字(2012)第 030492 号责任编辑:夏兆彦封面设计:责任校对:徐俊伟责任印制:出版发行:清华大学出版社网 址:http:/, http:/地 址:北京清华大学学研大厦 A 座 邮 编:100084社 总 机:010-62770175 邮 购:010-62786544投稿与读者服务:010-62776969, c-质量反馈:0

4、10-62772015,印 刷 者:装 订 者:肖 米经 销:全国新华书店开 本:185mm260mm 印 张:42.25 字 数:1055 千字(附 DVD 1 张)版 次:2012 年 6 月第 1 版 印 次:2012 年 6 月第 1 次印刷印 数:15000定 价:25.00 元产品编号:045147-01前 言为什么要写这本书随着计算机信息技术的飞速发展,数据存储已经成为很多公司越来越重视的问题。Oracle 公司的数据库管理软件以其稳定、高效和灵活性,一直是各大企事业单位后台存储的首选。Oracle 系统本身的复杂性,使得很多刚入门的开发人员不知从何入手,尽管Oracle 公司提

5、供了大量的文档,但是这些文档大多为英文版本,每个文档都偏重于某一技术细节,没有提供系统的、适合我国程序员思维的学习材料。目前在市面上关于 PL/SQL 的图书并不是很多,特别是由国内程序员经验总结的图书更是寥寥无几。本书作者站在一线开发人员的视角,通过简洁轻松的文字,简短精练的示例代码,以力求让不同层次的开发人员尽快掌握 Oracle 数据库开发为主旨编写了本书,同时在本书最后还提供了两个实战项目,让开发人员能够通过项目学习 PL/SQL 开发,提高实际开发水平和项目实战能力。本书有何特色1附带多媒体语音教学视频,提高学习效率为了便于读者理解本书内容,提高学习效率,作者专门为每一章内容都录制了

6、大量的多媒体语音教学视频。这些视频和本书涉及的源代码一起收录于配书光盘中。2涵盖 PL/SQL 语言的各种技术细节,提供系统化的学习思路本书涵盖了 PL/SQL 语言在实际项目中需要重点掌握的所有方面,包含语言基础、开发环境、常量和变量的定义、基本的控制结构、基本的 SQL 操作知识(比如查询、插入、修改和删除)、记录和集合、游标、SQL 的内置函数、事务处理、异常处理机制、子程序、包、触发器、面向对象的开发及动态 SQL 语句等知识点。3对 PL/SQL 开发的各种技术做了原理分析和实战体验全书使用简洁质朴的文字,配以大量的插图,将一些难以理解的原理部分进行了重点剖析,让读者不仅知晓实现的原

7、理,通过图形化的展现方式,更能加强对原理的理解,同时配以大量的示例对技术要点在实际工作中的应用进行了详解,让读者能尽快上手。4应用驱动,实用性强对于每段示例代码,都进行了仔细的锤炼,提供了各种实际应用的场景,力求让应用开发人员将这些知识点尽快应用到实际的开发过程中。5项目案例典型,实战性强,有较高的应用价值本书最后一篇提供了两个项目实战案例。这些案例来源于作者所开发的实际项目,具Oracle PL/SQL 从入门到精通 5有很高的应用价值和参考性。而且这些案例分别使用不同的 PL/SQL 技术实现,便于读者融会贯通地理解本书中所介绍的技术。这些案例稍加修改,便可用于实际项目开发中。6提供完善的

8、技术支持和售后服务本书提供了专门的技术支持邮箱:。读者在阅读本书过程中有任何疑问都可以通过该邮箱获得帮助。本书内容及知识体系第 1 篇 PL/SQL 开发入门(第 14 章)本篇介绍了 Oracle 的组成架构和 PL/SQL 开发的基础知识。主要包括 Oracle 体系结构、PL/SQL 开发环境、PL/SQL 的总体概览、常量和变量的定义,以及基本的 PL/SQL 控制 结构。第 2 篇 PL/SQL 开发基础(第 512 章)本篇是 PL/SQL 进行实际开发时必备的基础知识,包含使用 Oracle SQL 语句对数据表的查询、操纵;各种 Oracle 数据库对象的管理,比如同义词和序列

9、等;同时对 PL/SQL的记录与集合、各种 SQL 内置函数、游标、事务处理、锁定以及 PL/SQL 异常处理机制进行了详细的介绍。第 3 篇 PL/SQL 进阶编程(第 1316 章)本篇讨论了 PL/SQL 模块化编程相关的子程序、包、触发器的使用,这部分是实际工作中需要努力巩固的知识点,同时介绍了本地动态 SQL 技术的使用。这一篇的知识点是每个 PL/SQL 程序员必备的技能,在介绍形式上通过辅以大量与实际场景相结合的代码,提升开发人员的实战经验。第 4 篇 PL/SQL 高级编程(第 1718 章)本篇的内容针对已经熟练掌握了前面几篇的内容的开发人员,在具有了一定的PL/SQL 开发

10、经验后,可以通过本篇的内容学习使用面向对象的思维来开发 PL/SQL 应用程序,同时对于 PL/SQL 开发过程中的一些性能优化的注意事项进行了示例详解(提升开发人员的实战经验)。第 5 篇 PL/SQL 案例实战(第 1920 章)本篇通过两个实际的项目案例,从需求分析、数据库表的设计、系统的总体规划开始,到包规范的定义、包体的具体实现,详细剖析一个 PL/SQL 的实现生命周期,通过对这两个案例的一步一步深入体验,能让开发人员立即上手开始进行 PL/SQL 项目的开发。同时对这两个案例稍加修改,就能应用到实际的项目开发中。配书光盘内容介绍为了方便读者阅读本书,本书附带 1 张 DVD 光盘

11、,内容如下。 本书所有实例的源代码; 本书每章内容的多媒体语音教学视频; 免费赠送的 Oracle 入门教学视频。适合阅读本书的读者 需要全面学习 Oracle PL/SQL 开发技术的人员; 数据库开发程序员; 应用程序开发人员; Oracle 数据库管理人员; 希望提高项目开发水平的人员; 专业培训机构的学员; 软件开发项目经理; 需要一本 PL/SQL 案头必备查询手册的人员。阅读本书的建议 没有 Oracle PL/SQL 基础的读者,建议从第 1 章顺次阅读并演练每一个示例。 有一定 Oracle PL/SQL 基础的读者,可以根据实际情况有重点地选择阅读各个技术要点。 对于每一个知

12、识点和项目案例,先通读一遍有个大概印象,然后对于每个知识点的示例代码都在开发环境中操作一遍,加深对知识点的印象。 结合光盘中提供的多媒体教学视频再理解一遍,这样理解起来就更加容易,也会更加深刻。本书作者本书由丁士锋主笔编写。其他参与编写、资料整理和程序调试的人员有陈世琼、陈欣、陈智敏、董加强、范礼、郭秋滟、郝红英、蒋春蕾、黎华、刘建准、刘霄、刘亚军、刘仲义、柳刚、罗永峰、马奎林、马味、欧阳昉、蒲军、齐凤莲、王海涛、魏来科、伍生全、谢平、徐学英、杨艳、余月、岳富军、张健和张娜。在此一并表示感谢!笔者写作本书虽然耗费了大量精力,力争消灭错误,但恐百密难免一疏。若您在阅读本书的过程中发现任何问题,或

13、者有任何疑问,都可以随时提出,笔者将尽最大努力解决。联系邮箱:。编著者Oracle PL/SQL 从入门到精通 7第 5 章 管理数据表数据库表是 Oracle 数据库存储中基本但重要的部分,许多其他的数据库对象,例如索引、视图都以表为基础。在开发人员使用关系型数据库管理数据时,实际上就是通过创建一个或多个表来实现存储、约束等功能。5.1 创 建 表表是 Oracle 存储数据的基本单元,表与现实世界中的对象具有对应关系,在设计数据表时,一般使用 ER 图来构造实体关系模型, ER 图通常是对现实世界中的业务进行的建模。这些 ER 图在变成数据库对象时,最终要转换成表。数据库表又可称为二维数据

14、集合,表的结构由列(或字段)进行定义,列包含类型和一些约束信息,表行是这些列的数据,表中的行又称为记录,由一条记录来描述一个实例。5.1.1 数据定义语言 DDL用来创建表的 SQL 语言称为数据定义语言 DDL,DDL 的英文全称是 Data Definition Language,主要用来操纵 Oracle 数据库的结构。可以使用 DDL 语句定义、修改和删除在Oracle 中存在的每种类型的对象。数据定义语言主要由 CREATE、ALTER 与 DROP 3 个语句组成。1CREATE 语句CREATE 语句用来创建数据库对象,比如要创建数据库、数据表、索引或子程序、触发器等,根据创建的

15、数据库对象的类型的不同,具有多种不同的参数。例如可以使用 CREATE TABLE 创建一个数据库表,在下一小节会详细介绍创建的语法,或者可以使用 CREATE DATABASE 创建数据库,一些常见的使用 CREATE 语句的创建语法如下所示。CREATE INDEX:创建数据表索引。 CREATE PROCEDURE:创建存储过程。 CREATE FUNCTION:创建用户函数。 CREATE VIEW:创建视图。 CREATE TRIGGER:创建触发器。例如要创建一个公司的员工记录表,可以使用 CREATE TABLE,建表示例如代码 5.1所示。代码 5.1 使用 DDL 语句创建数

16、据表CREATE TABLE company_emp(empno NUMBER(4) PRIMARY KEY NOT NULL, -员工工号ename VARCHAR2(10 BYTE), -员工名称job VARCHAR2(9 BYTE), -员工职位mgr NUMBER(4), -所属经理hiredate DATE, -雇佣日期sal NUMBER(7,2), -员工工资comm NUMBER(7,2), -员工描述deptno NUMBER(2) -部门编码)从代码中可以看到,在 CREATE TABLE 语句中,定义了数据表的表列及 Oracle 数据表字段类型,该语句执行后,就可以在

17、当前用户方案下面看到 company_emp 表。2ALTER 语句ALTER 语句用来修改数据库对象,比如可以修改表、视图、索引、触发器的定义等,由于 ALTER 只需要修改数据库对象的局部,因此不需要定义完整的数据库对象参数,可以根据要修改的幅度来决定使用的参数,例如要向前面创建的表 company_emp 中添加一个名为 description 的列,可以使用如下的代码:ALTER TABLE company_emp ADD description VARCHAR2(200) NULL;-向 company_emp 添加表列上述代码中使用 ALTER TABLE 语句,向 company

18、_emp 表添加了一个名为description 的字段,该字段的类型为 VARCHAR2(200),允许 NULL 值。下面的代码同样使用 ALTER TABLE 语句来移除 description 字段:ALTER TABLE company_emp DROP COLUMN description; 上述代码中,使用了 ALTER TABLE 中的 DROP COLUMN 来移除 description 字段。3DROP 语句DROP 语句主要用来移除数据库对象,比如可以移除表、视图、索引等数据库对象,只需要在 DROP 语句后面输入要移除的对象名称即可,是 DDL 语法中最简单的语句。例

19、如要移除 company_emp 这个数据表,可以使用如下的 DROP 语法: DROP TABLE company_emp; -移除 company_emp 表所有的 DDL 语句的一个必须牢记的特色就是每一条 DDL 语句都包含了一个隐式提交的事务语句,因此只要这些命令执行,系统就会向数据库提交更改,所有具有访问数据库对象权限的用户马上就可以看到 DDL 语句的执行效果。注意: 在 PL/SQL 语句块中,不能直接使用 DDL 语句,可以通过动态 SQL 语句的形式来执行 SQL 命令。Oracle PL/SQL 从入门到精通 95.1.2 CREATE TABLE 语句CREATE TA

20、BLE 语句用来创建 Oracle 数据库表,创建数据库表最简单的形式是为CREATE TABLE 语句指定一个表名称,然后是括号包含起来的字段名称和字段类型。例如要创建一个简单的名为 workcenter 的表,可以使用如下的语法,如代码 5.2 所示。代码 5.2 简单的 CREATE TABLE 用法-创建表 workcenterCREATE TABLE workcenter -指定表名称( id int, -添加编号字段name varchar2(200) -添加名称字段)默认情况下,CREATE TABLE 会将表创建在当前的方案下,如果想在其他方案中创建数据表,那么可以使用“方案名

21、.表名称”这样的语法。例如如果想在 HR 方案中创建workcenter 数据表,可以使用如下的语法:-创建表 workcenterCREATE TABLE hr.workcenter -指定表名称( id int, -添加编号字段name varchar2(200) -添加名称字段)如果是使用 scott 用户登录,默认情况下是不能在 hr 方案之下创建表的,因此上述语句在执行时 Oracle 会触发 ORA-01031 异常。提示权限不足。 Toad 中的提示如图 5.1 所示。图 5.1 Toad 错误提示窗口通过使用如下所示的 GRANT 语句来为 scott 授予创建任何方案下的表、

22、视图和过程。GRANT CREATE ANY TABLE,CREATE ANY VIEW,CREATE ANY PROCEDURETO scott;注意: 在 Oracle 中,DDL 语句具有多种权限限制,一般只有具有管理员权限(DBA)才能建立数据库对象,不过通过 GRANT 和 REVOKE 语句,可以显式地为任何用户分配权限。在为数据库表命名时,应该遵循 Oracle 数据库对象的标准命名规则,如下所示。 表名和列名必须是具有描述性名称的字符串,以字母开头,且长度必须在 130个字符以内。 表名中只能包含字符 A Z、az、09、_(下划线)、 $和#(这两个字符虽然合法,但并不建议使

23、用)。 表名和列名不能与同一 Oracle 服务器用户拥有的其他对象重名。 表名和列名不能是 Oracle 服务器的保留字。注意: 表名和列表都是不区分大小写的。在 CREATE TABLE 语句的括号中,定义了列名,并使用 Oracle 内置的数据类型指定了列的类型,关于 Oracle 内置的数据类型,请参考本书第 3 章的内容。除了指定列的类型之外,还可以使用列类型属性来指定列的基本约束,常用的列特性有如下 3 个。 NOT NULL:指定列不接受 NULL 值,如果省略该值,列将允许接受 NULL 值。 UNIQUE:指定存储在列中的每一个值都必须唯一。 DEFAULT default_

24、value:指定列的默认值。例如下面的代码 5.3 使用 CREATE TABLE 语句创建了一个发票表 invoices,使用了列类型属性来对列进行基本的约束。代码 5.3 使用列约束创建表CREATE TABLE invoice(invoice_id NUMBER NOT NULL UNIQUE, -自动编号,唯一,不为空vendor_id NUMBER NOT NULL, -供应商 IDinvoice_number VARCHAR2(50) NOT NULL, -发票编号invoice_date DATE DEFAULT SYSDATE, -发票日期invoice_total NUMBE

25、R(9,2) NOT NULL, -发票总数payment_total NUMBER(9,2) DEFAULT 0 -付款总数)上述代码通过对列属性的使用,使得一些列的值不能为 NULL;一些列具有DEFALUT 指定的默认值;而一些列的值必须在整个表的相同的列中唯一。下面的语法是创建一个表的最基本的语法:CREATE TABLE schema_name.table_name(column_name_1 data_type column_attributes,column_name_2 data_type column_attributes.,table_level_constraints)O

26、racle 为表的创建提供了大量的参数,一些参数可能需要 DBA 来参与辅助设置,对于 PL/SQL 的开发人员来说,只需要了解这些基本的语法就可以完成很多的工作了。为了创建表,必须深入理解业务实体的数据类别及数据存储的容量,Oracle 内置了一系列的数据类型允许用户使用来创建一个表。在本书介绍 PL/SQL 数据类型时曾经介绍过,PL/SQL 支持访问所有的 Oracle 数据类型,Oracle 数据类型可分为标量、复合、引用和Oracle PL/SQL 从入门到精通 11LOB4 种类型,要了解数据类型的详细信息,可以参考本书 3.2 节对数据类型的介绍。5.1.3 在设计器中创建表如果

27、是使用 Toad、PL/SQL Developer 或者是 Oracle SQL Developer 等工具,可以直接使用工具提供的设计器来创建表。1在 Toad 中建表要使用 Toad 创建表,可以通过单击主菜单的“DatabaseCreateTable ”菜单项,或者是进入 Schema Browser 数据库模式窗口后,选择表节点(Treeview 模式)或者是表标签(Tab 模式),从下拉菜单栏或工具栏中选择创建表向导,如图 5.2 所示。图 5.2 使用 Toad 的表创建向导Toad 提供了多种数据表类型可供选择,这些数据表类型具有各自不同的用处,本书主要介绍标准表的创建,有兴趣的

28、读者可以参考 Oracle 文档获取其他类型的表的使用信息。对于已创建的表,Toad 提供了功能强大的表查看窗口,可以在查询语句或 PL/SQL代码编辑器中将鼠标指针放在名称字符串中,使用 F4 键打开表查看窗口,或者在 Toad的 SQL 编辑器中输入 DESC 表名,将显示如图 5.3 所示的表查看窗口。方案和表名及表类型选择表列和数据类型及基本约束定义常用的工具栏按钮图 5.3 表信息查看与修改窗口使用这个功能强大的窗口,允许 DBA 或系统管理员随时查看与表相关的所有的信息,比如权限、触发器、约束及表数据等。2在 PL/SQL Developer 中创建表与 Toad 类似, PL/S

29、QL 提供了表创建向导,可以通过单击“文件新建表”菜单项来打开如图 5.4 所示的表创建窗口。图 5.4 PL/SQL Developer 表创建向导窗口PL/SQL Developer 的表创建向导使用 Tab 页的形式提供了创建表的多个选项,比如指定表的存储选项,表的类型,表的列、键、约束、索引等信息。3在 Oracle SQL Developer 中创建表Oracle SQL Developer 同样提供了所见即所得的数据表设计器窗口,可以通过导航面板的树状视图,展开数据库连接节点,右击数据表节点,选择“新建表.”菜单项,将显示如图 5.5 所示的表设计器窗口。Oracle PL/SQL

30、 从入门到精通 13图 5.5 Oracle SQL Developer 创建表窗口在创建表窗口中,可以通过“添加列”按钮添加新的列,从下拉列表框中选择列数据类型及约束,并可单击“DDL ”标签页来查看创建表的数据定义语言。5.1.4 创建表副本CRETAE TABLE 提供的 AS SELECT 语句,允许从一个现有的表中创建一个新的表,创建的表可以包含原表的所有架构、字段属性、约束和数据记录;也可以仅架构完全相同,而不包含数据,其使用语法如下所示。CREATE TABLE AS SELECT * | column(s) FROM WHERE ;例如要创建 scott 方案下的 emp 表的

31、副本并包含所有的数据,则可以使用如下的语句:CREATE TABLE emp_copy AS SELECT * from scott.emp可以使用下面的语法仅创建一个架构而不包含任何表数据:CREATE TABLE emp_copy AS SELECT * from scott.emp WHERE 1=2;上述代码中,复制的新表将与原来的表列具有完全相同的定义,但是可以通过改变查询 SELECT 语句,例如使用函数进行类型的转换等来创建不完全相同的类型,如以下代码所示。CREATE TABLE emp_copy_others AS SELECT empno,ename,TO_CHAR(hir

32、edate,yyyy-MM-dd) AS hiredate FROM scott.emp;使用 CREATE TABLESELECT AS 方式有如下几个限制需要注意。 不能够复制约束条件与列的默认值,这需要手工重新建立。 不能够为新表指定表空间,默认情况下采用的是当前用户的默认表空间。 一些大对象数据类型(比如 Blob 类型)或者是 Long 数据类型的数据,如果包含这种类型的查询是不能创建成功的。5.2 创 建 约 束约束是一个或多个为了保证数据的完整性而实现的一套机制,约束是数据库服务器强制用户必须遵从的业务逻辑。它们限制用户可能输入指定范围的值,从而强制引用完整性。约束可以定义在字段

33、级别和表级别,根据约束的类别的不同指定约束定义的不同位置,在 Oracle 中最常使用的约束分为如下 5 类。 非空约束:验证字段的值不能为空,一般在字段级别使用 NOT NULL 列属性进行约束。 唯一约束:指定列的值在整个表的相同列中是唯一的,既可以在表级别也可以在字段级别定义,在字段级别使用 UNIQUE 进行声明。 检查约束:在定义数据库表时,在字段级别或在表级别加入检查约束,使其满足特定的要求,允许指定字段的检查条件,比如值大于 0 或小于 0 等。 主键约束:SQL 92 建议在建立一个表时定义一个主键,它其实就是:唯一约束+非空约束。 外键约束:用于定义表间关联的约束,实现数据完

34、整性,这是关系型数据库的 精髓。约束可以在创建表的时候定义,也可以在建表之后使用 ALTER 语句添加和修改约束。5.2.1 创建主键约束当使用 CREATE TABLE 语句创建表时,列的 NOT NULL 和 UNIQUE 关键字都是表列的约束,这些约束限制了在列中可以存储的数据的类型,除此之外,还可以在列类型的后面使用 PRIMARY KEY 关键字指定列的类型为主键。当为列指定了主键后,列被强制为 NOT NULL,并且列中的每行都被强制为一个唯一值,此外,会根据这个列自动地创建一个索引。例如对于 invoice 这个表,可以使用如下的语法来创建并指定主键,如代码 5.4 所示。代码

35、5.4 创建 invoice 表并指定主键CREATE TABLE invoice(invoice_id NUMBER PRIMARY KEY, -自动编号,唯一,不为空vendor_id NUMBER NOT NULL, -供应商 IDinvoice_number VARCHAR2(50) NOT NULL, -发票编号Oracle PL/SQL 从入门到精通 15invoice_date DATE DEFAULT SYSDATE, -发票日期invoice_total NUMBER(9,2) NOT NULL, -发票总数payment_total NUMBER(9,2) DEFAULT

36、0 -付款总数)注意: 如果 invoice 表已经 存在,则使用 DROP TABLE invoice 语句将其删除重建。代码中使用 PRIMARY KEY 关键字对 invoice_id 列进行修饰,表示将以 invoice_id 作为表的主键,这是最简单的指定表的主键的方式,但不是最好的编程习惯。注意: 如果没有 为约束指定名称,Oracle 将使用 SYS_Cn 格式自动生成一个名称,其中n 表示一个唯一性的整数,可以通过 USER_CONSTRAINTS 数据字典表来了解特定的表定义的约束。建议的方法是在列或表级别使用 CONSTRAINT 关键字,为约束指定一个约束名,因而对于创建

37、表的代码也可以使用如下的语法,如代码 5.5 使用了列级别的 CONSTRAINT关键字来创建表。代码 5.5 在列属性中使用 CONSTRAINT 关键字CREATE TABLE invoice(invoice_id NUMBER CONSTRAINT invoice_pk PRIMARY KEY,-自动编号,唯一,不为空 vendor_id NUMBER CONSTRAINT vendor_id_nn NOT NULL, -供应商 IDinvoice_number VARCHAR2(50) CONSTRAINT vendor_number_nn NOT NULL,-发票编号invoice_

38、date DATE DEFAULT SYSDATE, -发票日期invoice_total NUMBER(9,2) CONSTRAINT invoice_total_nn NOT NULL,-发票总数payment_total NUMBER(9,2) DEFAULT 0 -付款总数)通过将 CONSTRAINT 定义在列类型后面,可以显式地创建约束,并能为约束指定约束名称。对于 UNIQUE 与 PRIMARY KEY,还可以在表级别使用 CONSTRAINT 指定约束,比如在为一个表设置多个主键时,可以在表级别使用 CONSTRAINT 设置约束。在表级别与在列级别的效果是相同的,但是能提供

39、更清晰的代码,将代码 5.5 的CONSTRAINT 声明更改为表级别,实现如代码 5.6 所示。代码 5.6 在表级别使用 CONSTRAINT 关键字CREATE TABLE invoice(invoice_id NUMBER , -自动编号,唯一,不为空vendor_id NUMBER, -供应商 IDinvoice_number VARCHAR2(50), -发票编号invoice_date DATE DEFAULT SYSDATE, -发票日期invoice_total NUMBER(9,2) , -发票总数payment_total NUMBER(9,2) DEFAULT 0, -

40、付款总数CONSTRAINT invoice_pk PRIMARY KEY (invoice_id),CONSTRAINT vendor_id_un UNIQUE (vendor_id);上述代码相对于列类型来说最大的好处在于可以使用多列,比如通过在括号内输入以逗号分隔的多个列名,可以同时指定多列主键,例如如果要使用 invoide_id 和 vendor_id作为主键,可以使用如下所示的代码:CONSTRAINT invoiceid_vendorid_pk PRIMARY KEY (invoice_id,vendor_id),在为表设计主键时,下面是一些常用的设置规则。 主键应该是对用户没有

41、意义的,在一些数据表的设计中,不建议以材料编码或身份证号码及员工工号作为主键,主键应该只是一些具有唯一性标识的标识符,比如自增长的数字等。 主键应该是单列的,以便提高连接和筛选操作的性能,复合主键通常导致不良的外键,因此要尽量避免。 主键应该是不能被更新的,主键的主要作用是唯一标识一行,更新则违反了主键无意义的原则。 主键不应该包含动态更新的数据,比如时间戳、创建时间或修改时间等这些动态变化的数据。 主键最好由计算机自动生成,在 Oracle 中可以使用序列来为主键列生成值。5.2.2 创建外键约束外键约束又称为引用约束,这种类型的约束主要用来在多个表之间定义关系,并强制引用完整性,与主键约束

42、一样,外键约束也可以在列级别和表级别创建,使用关键字REFERENCES 语句来定义,列级别的外键约束语法如下所示。CONSTRAINT constraint_nameREFERENCES table_name (column_name)ON DELETE CASCADE|SET NULL位于的可选部分指定 CONSTRAINT 和约束名称,ON DELETE CASCADE|SET NULL这行代码用来指示是否级联删除,当两个表中的两个字段建立了外键关联后,如果主键所在表中的值被删除,使用 ON DELETE 指定是否级联删除, CASCADE 表示关联表中的内容一并删除,而 SET NUL

43、L 表示子表中的值设置为 NULL。注意: 如果没有指定 ON DELETE,默认情况下将使用 CASCADE 进行级联删除。假定有一个表 vendor,可以将 invoice 表的 vendor_id 与 vendor 表的 vendor_id 字段进行外键约束,也就是说,invoice 表中的字段取值必须是 vendor 表中已经存在的供应商字段,vendor 表的创建如代码 5.7 所示。代码 5.7 vendor 表的定义代码CREATE TABLE vendors(vendor_id NUMBER, -供应商 idvendor_name VARCHAR2(50) NOT NULL,

44、-供应商名称CONSTRAINT vendors_pk PRIMARY KEY (vendor_id), -主键Oracle PL/SQL 从入门到精通 17CONSTRAINT vendor_name_uq UNIQUE (vendor_name) -唯一性约束)下面的代码创建 invoice 表,在列级别为 invoice 表的 vendor_id 字段与 vendor 表的vendor_id 字段进行了关联,如代码 5.8 所示。代码 5.8 在 invoice 表中为 vendor_id 列创建外键关联CREATE TABLE invoice(invoice_id NUMBER , -

45、自动编号,唯一,不为空vendor_id NUMBER REFERENCES vendors (vendor_id), -供应商 IDinvoice_number VARCHAR2(50), -发票编号invoice_date DATE DEFAULT SYSDATE, -发票日期invoice_total NUMBER(9,2) , -发票总数payment_total NUMBER(9,2) DEFAULT 0, -付款总数CONSTRAINT invoiceid_vendorid_pk PRIMARY KEY (invoice_id,vendor_id),CONSTRAINT vendo

46、r_id_un UNIQUE (vendor_id);通过使用 REFERENCES 语法,指定要关联的目标表名与字段,示例中指定 vendors表的主键 vendor_id 列作为关联字段。注意: 在定 义外键时,引用的表键必须是唯一性键值,一般建议使用关联表的主键作为关联字段。同样可以在表级别使用 CONSTRAINT 关键字来创建外键约束,例如下面的代码在表级别使用 CONSTRAINT 定义了外键关联并指定了 ON DELETE 级联删除设置,如代码5.9 所示。代码 5.9 在 invoice 表级别创建外键关联CREATE TABLE invoice(invoice_id NUMB

47、ER , -自动编号,唯一,不为空vendor_id NUMBER, -供应商 IDinvoice_number VARCHAR2(50), -发票编号invoice_date DATE DEFAULT SYSDATE, -发票日期invoice_total NUMBER(9,2) , -发票总数payment_total NUMBER(9,2) DEFAULT 0, -付款总数CONSTRAINT invoiceid_vendorid_pk PRIMARY KEY (invoice_id,vendor_id),CONSTRAINT vendor_id_un UNIQUE (vendor_id),CONSTRAINT invoice_fk_vendors FOREIGN KEY (vendor_id) REFERENCES vendors (vendor_id) ON DELETE CASCADE

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报