文档章节

Oracle DDL

javayou
 javayou
发布于 2016/05/23 18:39
字数 2585
阅读 12
收藏 0

DDL是“数据定义语言”( Data Defination Language )的缩写,它包含CREATEALTERDROP 、RENAME 、TRUNCATE等命令,用来对数据库对象进行创建、修改、删除、重命名等操作。
其中CREATE 、ALTER和DROP命令的功能十分强大,几乎可以对所有的数据库对象进行管理,例如表、视图、索引、存储程序等。

表的创建

CREATE命令可用来创建表。

创建表时要确定表的结构,即确定表中各列的名字和类型。
在关系数据库中,表被看做是一个关系,表中的每个列是关系中的属性,是一个不可再分割的基本单位。
表中的行对应关系中的一个元组。

表的结构确定下来以后,就可以通过INSERT语句向表中插入数据了。
用来创建表的CREATE命令格式为:

CREATE TABLE 表名称(

列 l 数据类型,
列 2 数据类型,
..

);

表名是代表这个数据库对象的名称,对表名的要求是必须以字母开头,长度为l ~ 30个字符,而且只能包含A ~ Z 、a ~ z 、0 ~ 9 、一、$和#等字符,不能使用Oracle 的保留字,在同一个用户模式中不能拥有两个同名的表。

表中的每个列都有一个名字,在同一个表中不能有同名的列。

列的数据类型可以是系统预定义的类型,也可以是用户自定义类型。

数据类型描述
VARCHAR2(n) (可变长度的字符串.最大长度可达4000KB)
CHAR ( n) (固定长度的字符串,最大长度可达2000KB)
NUMBER (浮点类型的数据)
NUMBER ( m.n) (可表示整数和小数, m和n 分别为精度和1 小数位数)
DATE (日期型数据)
LONG (可变长度的字符串,最大长度可达2GKB)
RAWLONG RAW (存储二进制数据可变长度字符串
LOB 大对象类型  (存储大型的无结构的数据,如图形图像文本等数据,最大可达4GKB)

在创建表时,可以通过DEFAULT关键字为列指定一个默认值,这样当用INSERT语句插入一行时,如果没有为该列指定值,就以默认值填充,而不是插入空值。

如果要验证表的结构是否与期望的结果一致,可以在表创建之后通过DESC命令查看表的结构。
这个命令只能列出表中各列的列名数据类型以及是否为空等属性。

在创建表时,还可以以另一个表为模板确定当前表的结构。一般情况下,可以从一个表复制它的结构,从而快速创建一个表。
复制表的结构是通过子查询来实现的,即在CREATE语句中可以嵌套SELECT语句。这时的CREATE语句格式为:

CREATE TABLE 表名称 AS SELECT 语句;

CREATE语句将根据SELECT子句中指定的列,确定当前表的结构,然后将子查询返回的数据插入到当前表中,这样在创建表的同时向表中插入了若干行。

一般情况下,在通过这种方式创建的表中,列名和列的定义与原来的表一致。

如果希望在创建一个新表时指定与原来的表不同的列名,可以在CREATE语句中的表名之后指定新的列名。
如果只希望拷贝表的结构,而不复制表中的数据,可以将SELECT子句中的条件指定为一个永远为假的条件。

实际上,创建表的语句是非常复杂的,在表上可以定义约束,可以指定存储参数等属性。

在这里,顺便向读者介绍两个概念,一个是模式( Schema ),一个是数据字典( Datadictionary )。
模式指的是一个用户所拥有的所有数据库对象的逻辑集合。

在创建一个新用户时,同时创建了一个同名的模式,这个用户创建的所有数据库对象都位于这个模式中。
用户在自己的模式中创建表,需要具有CREATE TABLE 系统权限,如果需要在别人的模式中创建表,则需要具有CREATE ANY TABLE权限。
在访问其他用户的数据库对象时,要指定对方的模式名称,例如,通过SCOTT.EMP 引用SCOTT用户的emp表。

数据字典是一些视图,从这些视图中可以查看一些重要的系统数据,如数据库中的表、索引、权限、表空间等信息。
这些视图是在创建数据库时自动创建的,它们的内容也是由数据库服务器自动维护的。
用户可以查看以下几种形式的数据字典视图:
·以USER_开始的视图,
·以ALL_开始的视图,
.以DBA_开始的视图。
从USER_视图中可以查看当前用户所创建某类数据库对象,如在USER_TABLES 中可以查看当前用户所创建的任何一个表的信息。
从ALL_视图中可以查看当前用户有权限访问的某类数据库对象,如在ALL_TABLES 中可以查看当前用户有权限的任何一个表的信息。
在DBA视图中可以查看当前数据库中所有的某类对象的信息,如在DBA TABLES 中可以查看当前数据库中所有的表。
DBA_视图只能由数据库管理员(一般是SYS 用户)查看。

如何修改表的结构

表在创建以后,如果在使用的过程中发现表的结构不合理,可以通过执行ALTER命令修改它的结构。
修改表结构的操作包括增加列、修改某个列的定义、删除列、增加约束修改约束
表的重命名等。
ALTER命令可以使用若干个子句,通过这些子句可以完成修改表结构的操作。

可以使用的子句包括ADDDROPMODIFYRENAME等。

如果要在表中增加一个列,通过ADD子句指定一个列的定义,至少要包括列名和列的数据类型。
增加列的语句结构为:
ALTER TABLE 表名
ADD (列 1 ,数据类型,
列 2, 数据类型,
. . . ) ;

需要注意的是,如果一个表中已经有数据,这时增加一个列时,不能将该列约束为“非空(NOT NULL )”,因为我们不能一方面要求该列必须有数据,而另一方面又无法在增加列的同时向该列插入数据。
 

也就是说,要往一个表中增加一个非空列时,这个表必须是空的。

如果表中已经有数据,单独使用“NOT NULL”约束是不行的。
一种好的解决办法是为该列指定默认值,这样在增加一个非空列的同时,为这个列填充了指定的默认值。
ALTER TABLE 表名称 ADD 列名称 数据类型 DEFAULT 默认值 NOT NULL;

利用ALTER语句还可以从表中删除一个列。

用来完成这个操作的子句是DROP 。

用于删除列的ALTER语句格式为:

ALTER TABLE 表名称 DROP COLUMN 列名称;

一个列时,这个列将从表的结构中消失,这个列的所有数据也将从表中被删除。

原则上可以删除任何列,但是一个列如果作为表的主键,而且另一个表已经通过外键在两个表之间建立了关联关系,这样的列是不能被删除的。

注:此时可以通过删除外键约束,这样就可以删除主键列;亦或者可以通过删除主键约束,在删除主键约束时要加上关键字CASCADE。

一旦主键约束被删除了,外键约束也就被存在了,因为外键是依赖于主键列的。

如果要修改表中一个列的定义,可以使用ALTER语句的MODIFY 子句。

通过MODIFY 子句可以修改列的长度、非空、数据类型等属性。

注:MDOIFY子句修改列属性要根据表中已有数据来决定能否修改。
使用了MODIFY子句的ALTER语句格式为:

ALTER TABLE 表名称 MODIFY 列名称;

需要注意的是,如果表中目前没有数据,那么可以将一个列的长度增加或减小,也可以将一个列指定为非空。
如果表中已经有数据,那么可以增加列的长度,但在减少列的长度时,可能会因为列长度小于列的最大值而不允许修改;如果该列有空值,不能将该列指定为非空。

通过ALTER语句,还可以为表进行重命名,也就是将表的名字改为另一个名字。

为表重命名的ALTER语句格式为:

ALTER TABLE 表名称 RENAME TO 新表名称;

其他的DDL命令

除了CREATE和ALTER两条主要的命令外, DDL还包括DROP 、RENAME和TRUNCATE等几条命令。
其中DROP命令的功能是删除一个对象,通过这条命令几乎可以删除任何类型的数据库对象。
用来删除表的DROP命令的格式为:

DROP TABLE 表名称;

数据库对象删除后,它的有关信息就从相关的数据字典中删除。
RENAME命令的作用是对数据库对象重新命名。

对表进行重新命名的命令格式为:

RENAME 原表名称 TO 新表名称;

表被重新命名以后,它的信息就会在相关的数据字典中更新。

TRUNCATE命令的作用是删除表中的数据。

与DELETE语句不同的是, TRUNCATE命令将删除表中的所有数据,不需要指定任何条件,而且数据被删除后无法再恢复。
这条命令的语法格式为:

TRANCATE TABLE 表名称;

TRUNCATE命令作用的结果是删除所有的数据,而且不可恢复,所以这条命令要慎用。

从执行结果来看,一条TRUNCATE语句相当于下列两条语句的组合:

DELETE FROM 表名称;

COMMIT;

本文转载自:http://www.cnblogs.com/jy627625/p/5504218.html

javayou
粉丝 3
博文 52
码字总数 688
作品 0
太原
私信 提问
oracle中ddl为什么不能回滚

在ITPUB上看到有人提出了这个问题。在Sqlserver或一些其他的数据库中,DDL语句也是可以回滚的,那么Oracle为什么不能回滚DDL语句呢。 这个问题来自:http://www.itpub.net/thread-1300088-1...

foreverfeng
2012/09/17
0
0
oracle中ddl为什么不能回滚

要说明这个问题,首先需要说明什么是DDL语句。DDL语句是数据定义语句,包括各种数据对象的创建、修改和删除,以及授权等操作。 在Oracle中DDL语句将转化为修改数据字典表的DML语句。一个简单...

zh119893
2013/06/03
100
0
oracle的DDL语句事务性问题

最近要做一个Oracle的数据库升级脚本,期间涉及到了DDL。 印象中Oracle这种强大的东东可以让DDL也在一个事务里处理的,要么升级操作全部成功,要么失败回滚。 网上查了一大堆资料后,包括官方...

乌龟壳
2014/05/13
905
6
Oracle的DDL语句不能回滚(直接提交)

https://www.2cto.com/database/201209/155881.html 在Oracle中,Oracle执行DDL前会发出一个COMMIT语句,然后执行DDL操作,最后再发出一个COMMIT操作。附: DDL(data definition language):...

YuanyuanL
2018/07/31
0
0
Oracle Data Concurrency and Consistency二之Oracle锁机制

Oracle锁是Oracle在多个事务中防止破坏性访问相同资源的机制,Oracle自动维护必要的锁类型,在应用级别最少限制的情形下提供了最大的并发和数据完整性。同时,通过Oracle的Lock service,也允...

hawk682808
2013/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

4.01、Linux异常

1、无法连接虚拟设备ide1:0,因为主机上没有响应的设备 解决方法:找到“虚拟机” —— 打开“虚拟机设置” —— 单击“CD/DVD(IDE)”,右侧选中“使用ISO映像文件”,然后选中自己的镜像,重启...

静以修身2025
16分钟前
0
0
不允许有匹配 "[xX][mM][lL]" 的处理指令目标

Bug解决方案:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标 Caused by: org.xml.sax.SAXParseException; lineNumber: 1; c......

我叫小糖主
19分钟前
0
0
Mysql InnoDB 行锁和表锁介绍

mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表...

嘴角轻扬30
20分钟前
1
0
springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException

报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/a......

冥焱
38分钟前
1
0
威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙。我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名。 Xulu并不是第一个攻击...

迷你芊宝宝
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部