登陆注册
14082400000007

第7章 Oracle数据库基础——SQL语言(2)

(4)PRIMARY KEY约束(主键约束)

用于指定一列或多列的组合作为表的主键。表中只能有一个主键。主键可以作用于一列或多列,主键包含该键上的每一列的NOT NULL约束及UNIQUE约束。NOT NULL与UNIQUE的组合保证了主键唯一地识别表中的每一行。与UNIQUE约束一致,当建立主键约束时Oracle系统自动地产生一个B树UNIQUE索引。如果主键约束要作用于多列时,必须通过表级约束来定义。

(5)FOREIGN KEY约束(外键约束)

用于指定一列或多列的组合作为一个外键,使外键和指定的主键或唯一键之间建立一种关系。外键约束确保存在主键或唯一键约束的列上所有数据都不为NULL。外键列允许含有空值。

外键约束与主键约束和唯一性约束的区别是:外键约束系统不建立B树唯一索引,而主键约束和唯一性约束系统自动建立B树唯一索引。外键约束通常也叫做参考完整性约束,因为它强制两张表的数据之间的完整性。

含有主键或唯一键的表叫主表,其所包含的记录称为主记录。参考别的表主键的表叫子表,其所包含的记录称为子记录。外键列和主键列可以是同一张表的不同列(自参考完整性约束)。假如外键只保护一列的值,则外键可以在列级定义,是个列级约束。假如外键保护多列的值,则外键必须用下列语法定义表级约束。

默认情况是不带ON DELETE CASCADE子句,则假如子记录存在,禁止删除主记录。即当从dept表中删除10号部门(deptno10)的记录时,如果发现在emp表的deptno列的值有等于10的记录,则不允许在dept表中删除10号部门。

如果在定义外键约束时设ON DELETE CASCADE子句,则主记录删除时自动地级联删除子记录。即当从dept表中删除10号部门(depton10)的记录时,系统自动在emp表中删除deptno列等于10的记录。

如果在定义外键约束时设ON DELETE SET NULL子句,则主记录删除时更新子表,将子表中所有参考主记录的子记录设成null。即当从dept表中删除10号部门(deptno10)的记录时,如果发现在emp表的deptno列的值有等于10的记录,则修改emp表中所有deptno10的记录,将deptno10修改为deptnonull。

注意:参考约束时必须先建主表(如dept表),后建子表(如emp表)。子表参考的列deptno必须是主表的主键列(或定义了UNIQUE约束的列);子表中的外键列(deptno)的值必须是合法值(即该值必须在主表的主键列中存在)。

4.建表示例

执行上述CREATE TABLE语句就在数据库中建立了一个空的学生表student、课程表course和学生选课表sc。这些表的描述被存储在系统的数据字典中。

5.使用子查询建立表

可以使用一个基于一张或多张已经存在的表的子查询建立表,新建表的列的数据类型和宽度由查询结果集决定。使用子查询建表时只能指定列名、列的默认值、完整性约束条件,不能指定数据类型和外键约束条件。当建表时,如果没有指定列名,则列名由SELECT语句的列名决定。假如建表时已指定列名,则列的个数必须与子查询的SELECT列表中的列的个数一致。用这种方式建立的表可以选择另一张表的所有列、列的子集、列的表达式或函数。

例5-11 希望复制emp表的结构和数据到employee表中,可使用下列语句:

SQL>CREATE TABLE employee AS SELECT*FROM emp

例5-12 查询没有返回数据,则新建立的表是空的。假如只想拷贝表的结构,可使用下列语句确信查询没有结果。

SQL>CREATE TABLE y AS SELECT*FROM x WHERE 12

例5-13 在建表时指定列的别名,以便新建的表中有不同的列名。

注意:假如用子查询建立一张新表,只有列的NOT NULL约束条件被拷贝到新表中,其他约束条件及列的默认值不能被拷贝。

5.2.1.3 修改基本表结构

在基本表建立和使用一段时间后,可以根据需要对基本表的结构进行修改,即增加列、删除列,以及修改列的数据类型、列的定义或列的默认值,但不能重新命名列。还可以修改或增加约束条件的定义。

1.修改表结构的语法

修改表结构的语法如下:

ALTER TABLE<表名>[ADD<新列名><数据类型>[DEFAULT 默认值][列一级完整性约束]

[,<新列名><数据类型>[DEFAULT 默认值][列一级完整性约束]……[表一级约束条件]]]

[DROP CONSTRAINT<完整性约束名>]

[DROP COLUMN<列名>[CASCADE|RESTRICT]]

[MODIFY<列名><数据类型>[DEFAULT 默认值][列一级完整性约束]

[,<列名><数据类型>[DEFAULT 默认值][列一级完整性约束]……[表一级约束条件]]]

其中,<表名>指定需要修改的基本表的名称。

该命令包括以下四方面的内容。

ADD子句:用于增加新列和新的完整性约束条件。因为新增加的列上的值都被定义为NULL,所以新增加的列不能定义NOT NULL约束,否则就矛盾。

DROP CONSTRAINT<完整性约束名>子句:用于删除指定的完整性约束条件。

DROP COLUMN<列名>子句:用于删除指定的列。在删除列时如果指定CASCADE,则所有引用到该列的视图和约束也要一起自动地删除。如果指定RESTRICT,则只有没有视图和约束引用该列时,才能在基本表中删除该列。

MODIFY子句:用于修改原有的列定义,包括修改列名和数据类型、默认值、约束条件。

2.修改表结构示例

(1)增加新列

例5-14 向student表增加“入学时间”列,该列的数据类型为日期型。

SQL>ALTER TABLE student ADD come date

新增加的列总是表的最后一列。不论表中是否已有数据,新增加的列值为空。所以新增加的列不能有NOT NULL约束,否则就产生矛盾。假如表中增加多列,则列的定义必须用括号括起来,列之间用逗号分隔。假如已给新增加的列指定一个默认值,则表中所有行的该列将自动赋予默认值。

注意:当增加新列时,如果表中已经有数据,不能给新列指定NOT NULL约束条件。为了给列加NOT NULL约束条件,必须按下列步骤实现:修改表增加列;为所有已经存在的行更新列的值;然后加一个NOT NULL约束条件。

(2)修改列

列的数据类型、默认值、约束条件等可以修改,同时还可以修改多列,用逗号分隔,用括号括起来。假如修改中省略了列定义(数据类型、默认值、约束条件)中的某一部分,则表示这部分属性不变。

例5-15 将年龄的数据类型改为字符类型。

SQL>ALTER TABLE student MODIFY age varchar2(3)

在修改列的定义时需要遵循下列原则。

可以增加列值的宽度及小数点长度。

只有当某列所有行的值为空或整张表是空时,才能减小其列值宽度。

只有当某列所有行的值为空或整张表是空时,才能改变其列值的数据类型。假如没有改变列的长度,即使该列的值不为空,也可以将数据类型从CHAR转换成VARCHAR2或从VARCHAR2转换成CHAR。

只有当某列所有行的值不为空时,才能给该列加NOT NULL约束条件。

修改列的默认值只影响以后插入的数据的默认值。以前插入的默认值不变。

(3)删除列

如果删除多列,用括号括起来,列之间用逗号分隔。当删除列时,如果指定CASCADE,则列上的索引和约束条件同时被删除。否则,如果删除的列是一个多列约束条件中的一部分,则该列不能被删除。

例5-16 删除student表中age列,并且将引用该列的所有视图和约束一起删除。

SQL>ALTER TABLE student DROP COLUMN age CASCADE;

(4)增加约束条件

例5-17 给emp表的mgr列加一个参考键(REFERENCES)约束,让其他的值参考该表中的empno列的值。即mgr列的值必须是emp表的empno列的值之一。

SQL>ALTER TABLE emp ADD CONSTRAINT empmanageridfk

FOREIGN KEY(mgr)REFERENCES emp(empno)

例5-18 给emp表的empno列加一个非空的约束条件。

SQL>ALTER TABLE emp ADD CONSTRAINT chkempno(empno NOT NULL)

或者用MODIFY语句给EMPNO列增加NOT NULL约束条件:

SQL>ALTER TABLE emp MODIFY(empno NOT NULL)

(5)删除约束条件

为了删除约束,必须首先识别约束名,通过查看数据字典USERCONSTRAINTS、USERCONSCOLUMNS了解约束名。如果在删除约束条件时含有CASCADE选项,则所有依赖该约束条件的其他约束条件一起被删除。

例5-19 删除student表中的主键约束条件及所有参考该主键的其他约束条件。

SQL>ALTER TABLE student DROP PRIMARY KEY CASCADE

(6)约束条件生效和失效

为了改善大批数据装入时的操作性能,可以使约束条件失效。当大批数据装入后,为了保证以后插入数据的完整性,可以使失效的约束再次生效。这样不必删除和重建约束。

当使约束生效和失效时,需要遵循如下规则。

假如约束条件生效,则表中所有的数据必须满足约束条件。

假如UNIQUE和PRIMARY KEY约束生效时,Oracle系统自动建立UNIQUE索引。当UNIQUE和PRIMARY KEY约束失效时,Oracle系统自动删除UNIQUE索引。

可以在ALTER TABLE语句中使用DISABLE和ENABLE 子句让约束失效和生效。

CASCADE子句将所有依赖完整性约束一起失效或生效。

例5-20 将表上的约束条件生效和失效。

SQL>ALTER TABLE emp DISABLE CONSTRAINT empmanageridfk CASCADE

SQL>ALTER TABLE emp ENABLE CONSTRAINT empmanageridfk

5.2.1.4 删除和重命名基本表

当基本表不再需要时,可以使用DROP TABLE语句删除表结构和所有数据。

1.删除表

删除表的语法格式如下:

DROP TABLE<表名>[CASCADE CONSTRAINTS];

删除表时要注意以下几点:

表一旦被删除,则无法恢复。

如果表中有数据,则表结构连同数据一起删除。

在表上的索引、约束条件、触发器,以及表上的权限也一起被删除。

当删除表时,涉及该表的视图、存储过程、函数、包被设置为无效。

只有表的创建者或者拥有DROP ANY TABLE权限的用户才能删除表。

如果两张表之间有主外键约束条件,则必须先删除子表,然后再删除主表。

例5-21 删除“学生”表。

SQL>DROP TABLE student

2.重新命名表

RENAME命令用于重新命名一张表及其他的数据库对象,如:视图、私有同义词、序列生成器等。Oracle将自动地将旧表上的完整性约束、索引、权限转移到新表上。所有依赖于重新命名的表的对象(如:视图、同义词、存储过程、函数等)都被设成无效。语法如下:

RENAME oldname TO newname

例5-22 重新命名“雇员”表

SQL>RENAME emp TO employee

注意:只有对象的拥有者,才能重新命名对象,不能重新命名另一用户所拥有的对象。

3.TRUNCATE表

TRUNCATE命令用于删除一张表中的所有数据,并且释放该表所占的存储空间。该语句类似于DROP 语句,但没有删除表结构,所有表上的索引、约束条件、触发器、权限等都不被删除。语法如下:

TRUNCATE TABLE name

TRUNCATE功能与DELETE功能类似,但有以下区别:

DELETE命令从表中删除数据时,并不释放空间。而TRUNCATE命令删除数据时,释放空间。

DELETE命令写回退段,而TRUNCATE命令不写回退段,所以不能回退TRUNCATE操作。所以删除大表的所有数据时用TRUNCATE命令比用DELETE命令快得多。

DELETE命令可以有选择地删除行,而TRUNCATE命令不能有选择地删除行,只能全表删除。

注意:必须是表的拥有者或者拥有DELETE TABLE系统权限的用户才能TRUNCATE一张表。

5.2.2 视图的建立和删除

在关系数据库中,视图也被称为窗口,即视图是操作基本表的窗口。在三层体系结构中,视图对应外模式,是从基本表或其他视图派生出来的并依赖于基本表,它并不独立存在。在创建视图时,只把视图的定义存放在数据字典中,并不存储视图对应的数据,在使用视图时才执行定义视图的SELECT语句获取对应的数据。因此,视图被称为“虚表”。

视图一经定义,就可以和基本表一样被查询和删除。但对视图的插入、更新、删除操作有一定的限制。所有在视图上的操作都会影响其基表,并且会触发基表上定义的触发器,以及进行表上的完整性检查。

视图的优点是:提高数据的安全性、简化查询,隐藏查询的复杂性、提供数据的独立性。

5.2.2.1 视图的建立

1.建立视图的语法

视图是根据对基本表的查询定义的,其语法格式如下:

CRE ATE VIEW<视图名>[(<列名>[,<列名>]……)]

AS SELECT 查询语句

[WITH CHECK OPTION]

[WITH READ ONLY];

其中:

SELECT 查询语句可以参考一张或多张表,以及其他视图,可以包含联结、分组,以及子查询等一般的SELECT语句。它说明和限定视图中的数据。

定义中的任选项WITH CHECK OPTION表示对视图进行UPDATE和INSERT操作时要保证更新或插入的行满足视图定义时SELECT语句中的条件表达式。

WITH READ ONLY选项保证在视图上不能进行任何DML操作。

Oracle有两种类型的视图:简单视图和复杂视图。

同类推荐
  • 数据库原理及Oracle应用

    数据库原理及Oracle应用

    进入21世纪,随着国家信息化步伐的加快及各行业信息化进程的不断加速,社会对专业(非计算机专业)人才的信息技术能力要求越来越高。为了适应社会对专业人才的要求,全国各高校在重视专业知识培养的同时也非常注重计算机应用能力的训练,即信息技术能力的培养。计算机应用水平已成为衡量高校毕业生综合素质的突出标志之一。
  • 小型局域网组建与维护

    小型局域网组建与维护

    本书以组建和维护小型局域网为主线,面向实际工程应用,按照项目化课程模式的要求组织编排。全书共分8个项目,主要包括认识计算机网络一概述、绘制小型网络拓扑图、连接网络一传输介质、连接网络一联网设备、认识计算机网络一网络协议、连接网络一网络寻址、组建小型交换网络——配置交换机、连接互联网——配置宽带路由器。每个项目都有明确的工作目标、工作任务、实现过程和知识点分析,力求集教、学、做于一体,从而更好地激发学生的学习兴趣,培养学生的动手能力。
  • 数字博物馆研究与实践2009

    数字博物馆研究与实践2009

    本书汇集了“2009年北京数字博物馆研讨会”与会代表提交的60余篇论文和演讲报告、应用案例,分为数字博物馆(科技馆)发展研究探讨、数字博物馆(科技馆)多样性发展模式、数字技术在博物馆(科技馆)展陈中的应用、数字博物馆(科技馆)建设实践、数字博物馆(科技馆)实现技术和数字博物馆调研报告等六个部分。本书内容囊括了对数字博物馆(科技馆)建设宏观层面的全局思考以及微观层面的具体实践。在宏观层面,介绍了数字博物馆(科技馆)在国内外的发展现状与趋势,通过剖析典型案例,探讨数字博物馆(科技馆)建设的意义、目标、作用、建设原则、要素、特征及目前建设工作中存在的现实问题与对策。
  • 一本书读懂大数据

    一本书读懂大数据

    本书是深入研究互联网思维的经典之作,从互联网思维的定义到互联网思维应用的具体案例表现。作者深入浅出、条分缕析,全面阐述互联网思维的内核与精神,逐一点评当前关于互联网思维的各种观点。本书从最初级的互联网思维应用到高端的粉丝经济,平台建设,自媒体营销的方法都有详细讲解介绍。让读者了解什么是互联网思维的同时还能学会把互联网思维运用到自己的工作学习已经生活中。
  • 悟道:一位IT高管20年的职场心经

    悟道:一位IT高管20年的职场心经

    本书是一位有20多年职场经验的IT企业高管撰写的一系列有关职场悟道的短文集成,讲述的是在企业里如何修炼自己,如何摆平自己的心态,怎样做到“世事洞明”和“人情练达”,如何“搞定老板”,怎样做到工作和生活平衡等诸多话题,涉及到跳槽、转行、升迁、环境、沟通、老板、下属、老外等等。每一篇都以作者的亲身经历或者身边的故事说明道理,语言简洁流畅,妙趣横生,更有不少经典片段和发人深省的职场警句,读起来就像是一个睿智幽默的老朋友坐在你面前娓娓道来。
热门推荐
  • 东京美妆品购物全书

    东京美妆品购物全书

    《东京美妆品购物全书》是一本关于日本美妆品采购旅游指南性参考书。本书由作者郑世彬深入日本各大药妆公司、美妆公司实地考察,认真编写的美妆采购指南书,实用性强,信息权威度高,购买细节突出。这是一本让爱美人士不管是赴东京旅游与购物还是在国内需要了解日本美妆品牌最好、最实用的指南性书籍。
  • 缘之所起情之所依

    缘之所起情之所依

    她,世间少有。论聪明,没被她耍的团团转就不错了;论相貌,说她倾国倾城就是侮辱了她;论家世,她可是未来大陆的统治者;论法术,她从一出生开始就比她的父皇母后高;论财宝,你确定她没有吗?他冷漠无比,地位,和她的父皇母后的地位一样,只不过当初有点意外,他流落在外,是她找到了他。他,认为他这一辈子都体会不到爱,但她的出现却让他体会到了什么是爱,什么是心动的感觉。
  • 穿越冷血宠妃:浴火重生

    穿越冷血宠妃:浴火重生

    她是黑道至尊的孙女,因信错人,被害死亡,闺蜜成了陪葬品她是被人陷害的丑小鸭,荒山野岭,死无葬身之地她的到来是否能浴火重生,让丑小鸭变成白天鹅
  • 我的使徒

    我的使徒

    年轻的灵魂穿越到了异界,成为了原生神明。神明不应该是高坐云端的伟大存在吗?为什么我要自己发展信徒……还要照顾这些小屁孩的日常生活!好吧,快放开那个正太!什么?你想歪了,我绝对没有那种奇怪的爱好!他是我的使徒。别碰那个萝莉!看吧,被揍了吧,那也是我的使徒。
  • 我等你一直一直等你

    我等你一直一直等你

    “嘿嘿,这是你家的全家福么,啧啧啧,长得不错。”……就我这颜值从小帅到大,某闷骚男心里默默回答。“哇塞!你家的书柜真大。哎,看那么多书肯定累死了吧。”……就我这智商这么点书不足为奇,某自恋狂心里默默回答。“艾玛。你家的床好大哇!晚上睡觉滚起来肯定舒服。”……就我,不对劲,床大不大和我有什么关系!某傲娇男心里默默回答。
  • 巅峰修真狂少

    巅峰修真狂少

    一次意外重生,让龙啸宇获得了来自异界的超能力,平凡的命运就此改变:各道势力统统被他收服,爷有祖传中药秘方,专治各种不服;各色美女纷至沓来,暧昧连连;修真练武卖药,踏上至尊神位……看少年如何逍遥都市,争霸巅峰……
  • 最佳情人

    最佳情人

    有一种人渣叫做斯文败类,白柠无数次的想弄死他,可惜一直没找到机会,实在遗憾。男主就是披着狼皮的狗,遇到女主之前是狼,之后就变成了狗。
  • 全能家教

    全能家教

    混迹于江湖数十年的暴力哥,忽然有一天被拉去当家教老师,于是,他那风骚起伏的人生开始了……
  • 星辰君神

    星辰君神

    世界重组,异界袭击,十六岁的少年身处异界能否阻止阴谋的发生,。
  • 乱世挽歌之倾国皇妃

    乱世挽歌之倾国皇妃

    西风残照马啼呕哑,血溅白旗染千里,歌不尽是乱世烽火。衣带渐宽瑶琴弦断,红泪流断白青丝,诉不尽是半世离殇。她本是养于深闺受尽宠爱的将门嫡女,没有歹毒的嫡母,没有伪善的长姐,可无奈一夕祸起,她从万人羡慕的待嫁王妃变成了无依无靠的丧门星,本来被人津津乐道的天作之合的婚事也被废不在。这些不幸的事情为什么要发生在她身上,有人说天作孽不可违可她偏偏不信!终于绝处逢生逢凶化吉,美人财宝,我不需要,长命百岁,我不做王八,且看她如何在这乱世中守住自己的想要!乱世之中人才辈出,俊杰如云,或痴或愿,或偏执或洒脱,各有各的执念,世人弄人人心难测,相同的假面下会藏着怎样不同的面孔,他们会谱写出怎样的乱世挽歌。PS:此文讲述的是作者心中的乱世,作者一直认为乱世多出俊杰,所以此文多主角因此上帝视角。最后,此文多主角!作者会尽力不写乱的!