曹阳的博客 仅用于学习和分享

Oracle的学习1

2019-10-11

Oracle增删改查基础命令的学习

一、Oracle 11g的介绍及安装

1. Oracle数据库

  • 系统可移植性好、使用方便、功能强大
  • 是一种高效率、可靠性好的,适应高吞吐量的数据库解决方案

2. Oracle产品介绍

  • 1979年,甲骨文公司推出Oracle1,世界上第一个基于sql标准的关系数据库产品
  • Oracle 9i:i表示Internet
  • Oracle 11g:g代表网格计算(分布式),提升了分布式数据库的使用,目前的主流
  • Oracle 12c:c代表云计算,支持云服务,是现在的最新版本

3. Oracle 11g下载

  • www.oracle.com
  • 登录下载Oracle 11g企业版

4. 安装前建议

  • 关闭防火墙
  • 断网(不是必须的)

5. 安装过程

  • 字符集采用utf-8
  • 管理口令设为:Mm123456
  • 用户:sys/system/scott

6. Oracle服务

  • 全改为手动禁用
  • OracleOraDb11g_home1TNsListener:监听服务打开
  • OracleServiceORCL:实例服务打开

7. Oracle卸载

  • 使用Oracle提供的卸载程序卸载
  • 重启电脑,进入安全模式(按住F8)
  • 在安全模式下,找到系统上对应的磁盘路径删除Oracle文件
  • 运行注册表(regedit)搜索(Ctrl+F)所有与Oracle相关的内容并删除
  • 重启电脑后就可以重新执行安装

8. 数据库界面创建工具:DBCA

  • DBCA是Oracle11g提供的一个具有图形化用户界面的工具,用来帮助数据库管理员快速、直观地创建数据库
  • DBCA可以通过“开始”菜单中的Oracle程序组选项来启动

9. 数据库管理工具:SQL Developer

  • 新建连接,连接名为myorcl,用户名为scott,口令Mm123456,SID(数据库标识)为xscj

10. 命令管理工具:SQL Plus

  • 直接在开始菜单打开SQL Plus,输入用户名密码连接
  • 在命令行输入sqlplus,再输入用户名密码连接

11. 以界面方式创建数据库(采用DBCA)

二、数据库操作(增删改)

1. 表操作

- 表结构:每个表都包含一组固定的列,而列由数据类型(datatype)和长度(length)两部分,以描述该表所代表的实体的属性  
- 记录:每个表包含了若干行数据,它们是表的“值”,其中的一行称为一个记录,因此,表是记录的有限集合  
- 字段:每个记录由若干个数据项构成,将构成记录的数据项称为字段  
- 关键字:若表中记录的某个字段或字段组合能唯一标识记录,则称该字段(字段组合)为候选关键字。若一个表有多个候选关键字,则选定其中一个为主关键字(primary key),也称主键  

2. 创建表

  在以自己的模式创建表时,必须拥有createtable系统权限,在其他用户模式下创建表时,必须拥有createanytable系统权限  
- 语法格式  
  CREATE TABLE [<用户方案名>.]<表名>  
  (  
  <列名1> <数据类型> [DEFAULT <默认值>] [<列约束>]  
  <列名2> <数据类型> [DEFAULT <默认值>] [<列约束>]  
  [,...n]  
  <表约束> [,...]  
  )  
  [AS <子查询>]  

- 说明  
  用户方案名:用户方案是指该表所属的用户,如果省略则默认为当前登录的用户  
  default:关键字DEFAULT指定某一列的默认值。默认值的数据类型必须与该列的数据类型相匹配,列的长度必须足以容纳这一表达式值。  
  列约束:定义完整性约束作为列定义的一部分,该子句的语法为: 
    [NOT] NULL  
    [UNIQUE]  
    [PRIMARY KEY]  
    [REFERENCES [<用户方案名>.] <表名>(<列名>)]  
    [CHECK(<条件表达式>)]  

  表约束:定义一个完整性约束作为表定义的一部分  
  AS <子查询>:表示将由子查询返回的行插入到所创建的表中  

- 查看表结构:desc <表名>  

- 如果表的主键由两个或多个列组成,则必须使用`PRIMARY KEY`关键字定义为表的完整性约束  
  CREATE TABLE <表名>  
  (  
  <列名1> <数据类型> [DEFAULT <默认值>] [<列约束>] [,...n]  
  PRIMARY KEY(<列名1>,<列名2>[,...n])  
  )  

- 创建备份表  
  CREATE TABLE <新表名>  
  AS SELECT * FROM <原表名>  

- 复制表结构  
  CREATE TABLE <新表名>  
  AS SELECT * FROM XS WHERE 1=2;

3. 修改表

- 语法格式
  ALTER TABLE [<用户方案名>.]<表名>  
  [ADD(<新列名> <数据类型> [DEFAULT <默认值>] [列约束] [,...n])] /*增加新列*/  
  [MODIFY([<列名> [<数据类型>] [DEFAULT <默认值>] [列约束] [,...n])] /*修改已有列属性*/  
  [<DROP>子句] /*删除列或约束条件*/  

- 说明  
  ADD子句:用于向表中增加一个新列,新的列定义和创建表时定义列的的格式一样,一次可添加多个列,中间用逗号隔开  
  MODIFY子句:用于修改表中某列的属性(数据类型/默认值等),在修改数据类型时需要注意,如果表中该列所存数据的类型与将要修改的列类型冲突,则会发生错误  
  DROP子句:该子句用于从表中删除指定的字段或约束,语法格式为:  
    DROP[  
    COLUMN <列名>  
    |PRIMAYY [KEY]  
    |UNIQUE(<列名>,...n)  
    |CONSTRAINT <约束名>  
    |[CASCADE]  
    ]  

4. 删除表

- 语法格式:  
  DROP TABLE [<用户方案名>.]<表名>  

5. 插入记录

- INSERT语句  
  语法格式:  
    INSERT INTO <表名>[(<列名1>,<列名2>,...n)]  
    VALUES(<列值1>,<列值2>,...n)  
  利用`INSERT语句`还可以把一个表中的部分数据插入到另一个表中,但结果集中每行数据的字段数、字段的额数据类型要与被操作的表完全一致,语法格式为:  
    INSERT INTO <表名>  
    <结果集>  

- MERGE语句  
  在Oracle 12c中有MERGE语句,用于根据与源表连接的结果,对 目标表执行插入、更新或删除操作。例如,根据在一个表中找到的差异在另一个表中插入、更新或删除行,这种方法可以对两个表进行信息同步。语法格式如下:  
    MERGE INTO <目标表名>  
    USING <源表名> ON (<条件表达式>)  
    WHEN MATCHED THEN {UPDATE SET...|DELETE...}  
    WHEN NOT MATCHED THEN INSERT(...) VALUES(...)  

6. 删除记录

- DELETE语句  
  语法格式:  
    DELETE FROM <表名>  
    [WHERE <条件表达式>]  
  该语句的功能为从指定的表中删除满足条件的行.若省略WHERE子句,表示删除所有的行  

- TRUNCATE TABLE语句  
  如果确实要删除一个大表里的全部记录,可以用TRUNCATE TABLE语句,它可以释放占用的数据块表空间,此操作不可回退,谨慎使用。语法格式为:  
    TRUNCATE TABLE <表名>  

7. 修改记录

- 语法格式:
  UPDATE <表名>  
  SET <列名>={<新值>|<表达式>}[,...n]  
  [WHERE <条件表达式>]  
- 该语句在指定表的满足条件的记录中,由SET指定的各列的列值设置为SET指定的新值。若不使用WHERE子句,则更新所有记录的 指定列值  

三、数据库查询

1. 语法格式

  SELECT <列> FROM  <表或视图>  
  [WHERE <条件表达式>]  
  [GROUP BY <分组表达式>]  
  [HAVING <分组条件表达式>]  
  [ORDERR BY <排序表达式> [ASC|DESC]]  

2. 选择列

- 选择表中的列组成结果表,语法格式为:
  SELETE [ALL|DISTINCT] <列名列表>
  其中<列名列表>指出了结果的形式,其主要格式为:
    { * /*选择当前表或视图的所有列*/  
     |{<表名>|<视图>}.* /*选择指定的表或视图的所有列*/  
     |{<列名>|<表达式>} [[AS] <列别名>] /*选择指定的列*/  
     |<列标题>=<列名表达式> /*选择指定列并更改列标题*/  
    }[,...n]  

- 选择一个表中指定的列  
  使用SELECT语句选择一个表中的某些列,各列名之间要以逗号分隔,语法格式为:  

    SELECT <列名1>[,<列名2>[,...n]]  
    FROM <表名>  
    [WHERE <条件表达式>]  

- 修改查询结果中的列标题  
  如希望查询结果中的某些列或所有列显示时使用自己选择的列标题,可以在列名之后使用AS子句指定一个列别名来替代查询结果的列标题  

- 计算列值  
  使用SELECT对列进行查询时,在结果中可以输出对列值计算后的值,即SELECT语句可以使用表达式作为结果,格式为:  
    SELECT <表达式>[,<表达式>]  

- 消除结果集中的重复行  
  对表只选择其某些列时,可能会出现重复行。可以使用DISTINCT关键字消除结果集中的重复行,其格式是:
    SELECT DISTINCT <列名>[,<列名>...]
  关键字DISTINCT的含义是对结果集中的重复行只选择一个,保证行的唯一性。

3. 选择行

- 表达式的比较  
  比较运算符用于比较两个表达式值,共有个,分别是:=,<,<=,>,>=,<>,!=  
  比较运算的格式为:  
    <表达式1>{=|<|<=|>|>=|<>|!=}<表达式2>  
  当两个表达式值均不为空值(NULL)时,比较运算返回逻辑值TRUE(真)或FALSE(假);而当两个表达式值中有一个为空值或都为空值时,比较运算将返回UNKNOWN  

- 模式匹配  
  LIKE谓词用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char,varchar2和date类型的数据,返回逻辑值TRUE或FALSE。LIKE谓词表达式的格式为:  
    <字符串表达式1>[ NOT ]LIKE<字符串表达式2>[ ESCAPE'<转义字符>']  
  在使用LIKE时,可以使用两个通配符:"%"和"_"。若使用带"%"通配符的LIKE进行字符串比较,模式字符串中的所有字符都有意义,包括起始或尾随空格。  

- 范围比较  
  用于范围比较的关键字有两个:BETWEEN和IN  
  当要查询的条件是某个值的范围时,可使用BETWEEN关键字,BETWEEN关键字指出查询范围,格式为:
    <表达式>[ NOT ] BETWEEN <表达式1> AND <表达式2>  
  当不使用NOT时,若表达式的值在表达式1与表达式2之间(包括这个值),则返回TRUE,否则返回FALSE;使用NOT时,返回值刚好相反  

- 空值比较  
  当需要判定一个表达式的值是否为空值时,使用IS NULL关键字,格式为:
    <表达式> IS [NOT] NULL  
  当不使用NOT时,若表达式的值为空值,返回TRUE,否则返回FALSE;当使用NOT时,结果刚好相反  

- 子查询  
  子查询通常与谓词IN、EXIST及比较运算符结合使用  
  (1) IN子查询  
    IN子查询用于进行一个给定值是否在子查询结果集中的判断,格式为:  
      <表达式>[ NOT ] IN (<子查询>)  
    当表达式与子查询的结果表中的某个值相等时,IN谓词返回TRUE,否则返回FALSE;若使用NOT,则返回的值刚好相反  
    在执行包含子查询的SELECT语句时,系统先执行子查询,产生一个结果表,再执行查询  
  (2) 比较子查询  
    这种子查询可以认为是IN子查询的扩展,它使表达式的值与子查询的结果进行比较运算,格式为:  
      <表达式>{=|<|<=|>|>=|<>|!=}{ALL|SOME|ANY}(<子查询>)  
    其中,ALL、SOME和ANY关键字说明对比较运算的限制。ALL指定表达式要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较的关系时,才返回TRUE;SOME和ANY表达式只要与子查询结果集中的某个值满足比较的关系时,就返回TRUE  
  (3) EXISTS子查询  
    EXISTS谓词用于测试子查询的 结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可以与NOT结合使用,即NOT EXISTS,其返回值与EXISTS刚好相反,格式为:  
      [NOT]EXISTS(<子查询>)  

4. 连接查询

- 连接谓词  
  可以在SELECT语句的WHERE子句中使用比较运算符给出连接条件对表进行连接,将这种表示形式称为连接谓词  

- 以JOIN关键字指定的连接  
  Oracle的PL/SQL语言扩展了以JOIN关键字连接的表示方式,增强了表的连接运算能力。连接表的格式为:  
    <表名> <连接类型> <表名> ON <条件表达式>  
    |<表名> CROSS JOIN <表名>  
    |<连接表>  
    其中,<连接类型>的格式为:  
    <连接类型>::=  
    [INNER|{LEFT|RIGHT|FULL}[OUTER]] CROSS JOIN  
  其中,INNER表示内连接,OUTER表示外连接,CROSS JOIN表示交叉连接,因此,以JOIN关键字指定的连接有三种类型  

- 内连接   
  内连接按照ON所指定的连接条件合并两个表,返回满足条件的行(不去重)  

- 外连接  
  外连接的结果表不但包含满足连接条件的行,还包括响应表中的所有行。包括以下三种:  
  (1) 左外连接(LEFT OUTER JOIN):结果表中处理包括满足条件的行外,还包括左表的所有行  
  (2) 右外连接(RIGHT OUTER JOIN):结果表中处理包括满足条件的行外,还包括右表的所有行  
  (3) 完全外连接(FULL OUTER JOIN):结果表中处理包括满足条件的行外,还包括两个表的所有行  

- 交叉连接  
  交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每一行和第二个表的每一行拼接后形成的表,因此其行数等于两表行数之积  

5. 汇总

- 统计函数   
  (1) SUM和AVG函数  
  SUM/AVG([ALL|DISTINCT] <表达式>)  
  其中表达式还可以是常量、列、函数。SUM和AVG函数只能对数值型数据进行计算  
  ALL表示对所有值进行运算,DISTINCT表示去除重复值,默认为ALL  
  SUM/AVG函数计算时忽略NULL值  
  (2) MAX和MIN函数  
  MAX/MIN([ALL|DISTINCT] <表达式>)  
  其中表达式的数据类型可以是数值、字符和时间日期类型。
  ALL表示对所有值进行运算,DISTINCT表示去除重复值,默认为ALL  
  MAX/MIN函数计算时忽略NULL值  
  (3) COUNT函数  
  COUNT({[ALL|DISTINCT] <表达式>}|*)
  ALL表示对所有值进行运算,DISTINCT表示去除重复值,默认为ALL,选择*时将统计总行数  
  COUNT函数计算时忽略NULL值  

- GROUP BY子句  
  GROUP BY子句用于对表或视图中的数据按字段分组,语法格式为:  
  GROUP BY [ALL] <分组表达式>[,...n]  
  分组表达式通常包含字段名,指定ALL将显示所有组  
  使用GROUP BY子句后,SELECT子句中的列表中只能包含在GROUP BY中指出的列或在统计函数中指定的列

- HAVING子句  
  [HAVING <条件表达式>]  
  HAVING子句的查询条件与WHERE子句类似,不同的是HAVING子句可以使用统计函数,而WHERE子句不可以  

6. 排序

[ORDER BY {<排序表达式> [ASC|DESC]}[,...n]]  
其中排序表达式可以是列名、表达式或一个正整数,当表达式是一个正整数时,表示按表中的该位置上列排序  
关键字是ASC表示升序排列,DESC表示降序排列,系统默认值是ASC

7. 合并

使用UNION子句可以将两个或多个SELECT查询的结果合并成一个结果集,其语法格式为:
<SELECT 查询语句1>  
UNION [ALL] <SELECT查询语句2>  
[UNION [ALL] <SELECT查询语句2> [...n]]  
使用UNION组合两个查询的结果集的两条基本规则如下:
①所有查询中的列数和列的顺序必须相同  
②数据类型必须兼容  

四、视图

1. 视图的优点

- 为用户集中数据,简化用户的数据查询和处理  
- 屏蔽数据库的复杂性  
- 简化用户权限的管理(增加了安全性)  
- 便于数据共享  
- 可以重新组织数据,以便输出到其他应用程序中  

2. 创建视图

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [<用户方案名>.]<视图名>  
  [(<列名>[,...n])]  
AS   
<SELECT查询语句>  
[WITH CHECK OPTION[CONSTRAINT <约束名>]]  
[WITH READ ONLY]  

创建视图时,源表可以是基表也可以是视图  

例:创建CS_KC视图,包括计算机专业各学生的学号、其选修的课程号及成绩,要保证对该视图的修改都符合专业名为"计算机"这个条件  
CREATE OR REPLACE VIEW CS_KC  
  AS  
  SELECT XSB.学号,课程号,成绩  
    FROM XSB,CJB  
    WHERE XSB.学号=CJB.学号 AND 专业='计算机'  
    WITH CHECK OPTION;

3. 查询视图

跟查询表一样  
例:查找计算机专业的学生学号和选修的课程号  
SELECT 学号,课程号  
  FROM CS_KC;

4. 修改视图的定义

例:修改视图CS_KC的定义,增加姓名、课程名和成绩字段  
CREATE OR REPLACE FORCE VIEW CS_KC  
AS  
SELECT XSB.学号,XSB.姓名,CJB.课程号,KCB.课程名,成绩  
  FROM XSB,CJB,KCB  
  WHERE XSB.学号=CJB.学号 AND CJB.课程号=KCB.课程号  
    AND 专业='计算机'  
  WITH CHECK OPTION;

5. 删除视图

DROP VIEW <视图名>

6. 更新视图

- 可更新视图  
  (1) 没有使用连接函数、集合运算函数和组函数  
  (2) 创建视图的SELECT语句中没有聚合函数且没有GROUP BY、ONNECT BY、START WITH子句及DISTINCT关键字  
  (3) 创建视图的SELECT语句不包含从基表列通过计算所得的列  
  (4) 创建视图没有包含只读属性

- 插入数据  
  例:向CS_XS视图中插入一条记录:('151115','刘明义','计算机',男,'1996-3-2',50,'三好学生')  
  INSERT INTO CS_XS  
  VALUES('151115','刘明义','男',TO_DATE('19960302','YYYYMMDD'),'计算机',50,'三好学生');

- 修改数据  
  例:将XS_KC视图中学号为151101的学生的101号课程成绩改为90  
  UPDATE CS_KC SET 成绩=90 WHERE 学号='151101' AND 课程号='101';  
  视图CS_KC依赖于XSB和CJB两个基本表,对CS_KC视图的一次修改只能改变学号(源于XSB)或者课程号和成绩(源于CJB)

- 删除数据  
  使用DELETE语句可以通过视图删除基本表的数据,但要注意:对于依赖于多个基本表的视图,不能使用DELETE语句  
  语法和删除表一样DELETE FROM 视图名 WHERE 条件表达式  

五、索引

1. 索引的作用

- 快速存取数据  
- 既可以改善数据库性能,又可以保证列值的唯一性  
- 实现表与表之间的参照完整性  
- 在使用ORDER BY、GROUP BY子句进行数据检索时,利用索引可以减少排序和分组的时间  

2. 索引的分类

- 按存储方法分类  
  (1) B*树索引  
    B*树索引的存储结构类似图书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于图书的大目录,叶块相当于索引到的具体的书叶  
    Oracle用B*树(B*-tree)机制存储索引条目,以保证用最短路径访问键值  
    默认情况下大多使用B*树索引,该索引就是通常所说的唯一索引、逆序索引等  
  (2) 位图索引  
    位图索引主要用来节省空间,减少Oracle对数据块的访问  
    它采用位图偏移方式来与表的行ID号对应  
    采用位图索引一般是在重复值太多的表字段情况下  

- 按功能和索引对象分类  
  (1) 唯一索引:不会有两行相同的索引键值  
  (2) 非唯一索引  
  (3) 分区索引:索引可以分散地存在于多个不同的表空间中,其优点是可以提高数据查询的效率  
  (4) 为排序索引:也称正向索引
  (5) 逆序索引:也称反向索引,该索引同样保持索引列按顺序排列,但是颠倒已索引的每列的字节  
  (6) 基于函数的索引:索引的一列或多列是一个函数或者表达式,索引根据函数或者表达式计算索引列的值  

3. 使用索引的原则

- 导入数据后再创建索引  
- 再适当的表和列上创建适当的索引  
- 合理设置复合索引中列的顺序  
- 限制表中索引的数量  
- 选择存储索引的表空间  

4. 创建索引

- 创建索引的条件  
  (1) 索引的表或簇必须在自己的模式中  
  (2) 必须在索引的表上具有INDEX权限  
  (3) 必须具有CREATE ANY INDEX权限  
- 语法格式  
  CREATE [UNIQUE|BITMAP] INDEX  /*索引类型*/  
    [<用户方案名>.]<索引名>  
  ON <表名>(<列名>|<列名表达式>[ASC|DESC][,...n])  
  [LOGGING|NOLOGGING]  /*指定是否创建相应的日志记录*/  
  [COMPUTE STATISTICS]  /*生成统计信息*/  
  [COMPASS|NOCOMPASS]  /*对复合索引进行压缩*/    
  [TABLESPACE <表空间名>]  /*索引所属表空间*/  
  [SORT|NOSORT]  /*指定是否对表进行排序*/  
  [REVERSE]  

5. 维护索引

使用ALTER INDEX命令维护索引必须在操作者自己的模式中,或者操作者拥有ALTER INDEX系统权限,语法格式如下:  
ALTER INDEX [<用户方案名>.]<索引名>   
[LOGGING|NOLOGGING]  /*指定是否创建相应的日志记录*/  
[TABLESPACE <表空间名>]  /*索引所属表空间*/  
[SORT|NOSORT]  /*指定是否对表进行排序*/  
[REVERSE]  
[RENAME TO <新索引名>]

6. 删除索引

DROP INDEX [<用户方案名>.]<索引名>  

六、数据完整性

1. 数据完整性的分类

1. 域完整性  
  域完整性又称列完整性,指定一个数据集对某一个列是否有效和确定是否允许空值  
  域完整性通常是经过使用有效性检查来实现的,还可以通过限制数据类型、格式或者可能的取值范围来实现  

2. 实体完整性  
  实体完整性也称行完整性,要求表中的每一行有一个唯一的标识符,这个标识符就是主关键字  
  通过索引、UNIQUE约束、PRIMARY KEY约束可实现数据的实体完整性  

3. 参照完整性  
  主键是指在表中能唯一标识表的每个数据行的一个或多个表列  
  外检是指如果一个表的一个若干个字段的组合是另一个表的主键,则称该字段或字段组合为该表得到外键  
  一旦两个表定义了参照完整性,则有如下要求:  
  (1) 从表不能引用不存在的键值  
  (2) 如果主表中的键值更改了,那么在整个数据库中,对从表中该键值的所有引用都要进行一致的更改  
  (3) 如果主表中没有关联的记录,则不能讲记录添加到从表  
  (4) 如果要删除主表中的某一记录,应先删除从表中与该记录匹配的相关记录  

4. 完整性约束  
  完整性约束是通过限制列数据、行数据和表之间数据来保证数据完整性的有效方法  
  约束是保证数据完整性的标准方法  
  每一种数据完整性类型都可以由不同的约束类型来保障  
  约束确保有效的数据输入到列中并维护表与表之间的关系
  以下是完整性约束的分类:  
  (1) `NOT NULL`:指定表中某个列不允许空值,必须为该列提供值  
  (2) `UNIQUE`:使某个列或某些列的组合唯一,防止出现冗余值  
  (3) `PRIMARY KEY`:使某个列或某些列的组合唯一,也是表的主关键字  
  (4) `FOREIGN KEY`:使某个列或某些列为外关键字,其值与本表或者另表的主关键字匹配,实现引用完整性  
  (5) `CHECK`:指定表中的每一行数据必须满足的条件

2. 域完整性的实现

1. 在创建表时创建约束
CREATE TABLE <表名>(  
<列名> <数据类型> [DEFAULT <默认值>] [NOT NULL|NULL]  
[CONSTRAINT <CHECK约束名>] CHECK(<CHECK约束表达式>)  /*定义为列的约束*/  
[,...n]  
[CONSTRAINT <CHECK约束名>] CHECK(<CHECK约束表达式>)  /*定义为表的约束*/  
)  

2. 在修改表时创建约束
ALTER TABLE <表名>  
ADD( CONSTRINT <CHECK约束名> CHECK(<CHECK约束表达式>))  

3. 删除约束
ALTER TABLE <表名>  
DROP CONSTRAINT <CHECK约束名>  

4. PRIMARY KEY约束和UNIQUE约束的主要区别
- 一个表只能创建一个PRIMARY KEY约束,但可根据需要对不同的列创建若干个UNIQUE约束  

- PRIMARY KEY字段的值不允许为NULL,而UNIQUE字段的值可取NULL  

- 对于PRIMARY KEY约束与UNIQUE约束来说,都是由索引强制实现的  

- 在实现PRIMARY KEY约束与UNIQUE约束时,Oracle按照下面过程来实现  
  (1) 如果禁止该约束,则不创建索引  
  (2) 如果约束是允许的,且约束中的列时某个索引的一部分,则该索引用来强制约束  
  (3) 如果约束是允许的,且约束中的列都不是某个索引的一部分,那么按照下面的规则创建索引  
    ① 如果约束是可延迟的,则在这种约束的列上创建一个非唯一性索引  
    ② 如果约束是非可延迟的,则创建一个唯一性索引  

3. 实体完整性的实现

1. 创建表的同时创建约束
CREATE TABLE <表名>  /*指定表名*/  
(<列名> <数据类型> [NULL|NOT NULL]  /*定义字段*/  
  {[CONSTRAINT <约束名>]  /*定义约束名*/  
    PRIMARY KEY|UNIQUE}  /*定义约束类型*/  
    [,...n]  
  [,[CONSTRAINT <约束名>]{PRIMARY KEY|UNIQUE}(<列名>,[,...n])]  
  )  

2. 通过修改表来创建约束
ALTER TABLE <表名>  
ADD([CONSTRAINT <约束名>]{PRIMARY KEY|UNIQUE}(<列名>[,...n]))  

3. 删除约束
ALTER TABLE <表名>  
DROP CONSTRAINT <约束名>[,...n];  

4. 参照完整性的实现

1. 创建时要考虑的因素
(1) 在删除主表之前,必须删除FOREIGN KEY约束  
(2) 如果不删除或禁止FOREIGN KEY约束,则不能删除主表  
(3) 在删除包含主表的表空间之前,必须先删除FOREIGN KEY约束  

2. 创建表的同时定义外键约束
CREATE TABLE <从表名>  
(<列定义>[ CONSTRAINT <约束名>] REFERENCES <主表名>[(<列名>[,...n])]  
  [,...n]  
  [[CONSTRAINT <约束名>][FOREIGN KEY(<列名>[,...n])[<参照表达式>]]]  
);  

其中:  
<参照表达式>::=  
REFERENCES <主表名>[(<列名>[,...n])]  
[ ON DELETE {CASCADE|SET NULL}]  

3. 通过修改表定义外键约束
ALTER TABLE <表名>  
ADD CONSTRAINT <约束名>  
  FOREIGN KEY( <列名>[,...n])  
  REFERENCES <主表名>(<列名>[,...n])<参照表达式>  

4. 删除表间的参照关系
删除表间的参照关系,实际上删除从表的外键约束即可,语法格式与前面其他约束删除的格式相同  

上一篇 Windows下git

下一篇 MongoDB的学习

Content