数据表-特性与维护

        数据表(通常简称表)是Oracle数据库中主要的数据存储容器,表中的数据被组织成行和列。表中的每个列均有一个名称,并且每个列都具有一个指定的数据类型和大小,比如,VARCHAR(30),TIMESTAMP(6)或NUMBER(12)。

  在关系型数据库中,表可以对应于现实世界中的实体(如,雇员、岗位等)或联系(如,雇员工资)。在进行数据库设计时,需要首先设计E-R图(实体联系图),然后再将E-R图转变为数据库中的表。

  从用户的角度来看,数据表的逻辑结构是一张由行列组成的二维表。表通过行和列来组织数据。通常称表中的一行为一条记录,表中的一列为属性列。一条记录描述一个实体,一个属性列描述实体的一个属性,如,雇员有雇员编号、雇员姓名、雇员岗位等属性;学生有学生编号、姓名、所在学校等属性。每个列都具有列名、列数据类型、列长度,可能还有约束条件、默认值等,这些内容在创建表时即被确定。

  在Oracle中,有多种类型的表。不同类型的表各有一些特殊的属性。适应于保存某种特殊的数据、进行某些特殊的操作,即在某些方面可能比其他类型的表的性能更好,如处理速度更快、占用磁盘空间更少。

  表一般指的是一个关系表,也可以生成对象表及临时表。其中,对象表是通过用户定义的数据类型生成的,临时表用于存储专用于某个事务或者会话的临时数据。

system给用户授权

grant connect,resource to userName;

创建数据表

  实际上通过CREATE TABLE语句创建表并不是很难的事,而难点是要确定被创建的表应该包含哪些列以及这些列的数据类型,而这些内容最好在对用户需求分析的基础上进行确定。Oracle提供了多种内置的列的数据类型,常用到的包括数值类型、字符类型、日期类型、LOB类型与ROW ID类型。 

字符类型

  char: 固定长度字符串,可1-2000个字节。如:char(12)

  varchar2:可变长度,1-4000个字节。如:varchar2(20)

  long:可变长度,最多2G,一个遗留下来的而且在将来不会被支持的数据类型。它将被LOB(Large Object)数据类型所代替。

数值类型

  可以存储整数、浮点数和实数

  最高精度为 38 位

  格式: NUMBER [( p[, s])]

日期时间类型

  Date:存储日期和时间部分,精确到整个的秒

  Timestamp:存储日期、时间和时区信息,秒值精确到小数点后6位

LOB类型

  BLOB: 二进制数据

  CLOB: 字符型数据
  BFILE: 二进制文件

ROWID类型

  ROWID 数据类型是ORACLE数据表中的一个伪列,它是数据表中每行数据内在的唯一的标识。

 

数据表的特性

  1.存储参数 可用于:表空间、回滚段、表、索引、分区、快照、快照日志

  当用户在Oracle中创建表时,Oracle允许用户指定该表如何使用磁盘上的存储空间。如果仅为表指定了表空间,而没有设置存储参数,则该表将采用其所属表空间的默认存储参数。

       2.数据块管理参数

  对于一般不带有LOB类型的数据表而言,一个数据块可以存放表的多行记录,用户可以设置的数据块管理参数主要分为以下两类。

      (1)PCTFREE和PCTUSED

      (2)INITRANS参数:指定一个数据块所允许的并发事务数目。

  3.重做日志参数

  重做日志记录了数据库中数据的改变情况,这样,如果发生故障导致数据不能从内存中写入到数据文件中时,就可以从重做日志中获取被操作的数据。这样就可以防止数据丢失,从而提高表中数据的可靠性。 

  4.缓存参数

  当在Oracle中执行全表搜索时,读入缓存中的数据块将会存储在LRU列表的最近最少使用的一端。这意味着如果进行查询操作,并且必须向缓存中存储数据时,就会将刚读入的数据块换出缓存。 

维护数据表

  在创建表后,如果发现对表的定义有不满意的地方,可以对表进行修改。普通用户只能对自己模式中的表进行修改,如果要对任何模式中的表进行修改操作,用户必须具有ALTER ANY TABLE系统权限。

  • 新增字段
ALTER TABLE tab_name ADD column_name property;
  • 删除字段
ALTER TABLE tab_name DROP COLUMN col_name;
  • 修改字段

  除了在表中增加和删除字段外,还可以根据实际情况修改字段的有关属性,包括修改字段的数据类型的长度、数字列的精度、列的数据类型和列的默认值等。修改字段通常使用ALTER TABLE…MODIFY语句,其语法格式如下:

ALTER TABLE table_name MODIFY column_name column_property
  • 重命名表
ALTER TABLE table_old_name RENAME TO table_new_name
  • 修改表空间

    若要将一个“非分区”表移动到一个新的表空间,则可以使用ALTER TABLE…MOVE TABLESPACE语句。

  • 修改存储参数

    修改存储参数,主要是指修改数据块参数PCTFREE和PCTUSED,若改变了这两个参数值,则表中所有的数据块都将受到影响,而不论数据块是否已经使用

  • 删除表
DROP TABLE table_name [CASCADE CONSTRAINTS];

  CASCADE CONSTRAINTS 表示所有引用这个表的视图、约束或触发器等也都被删除。

  一般情况下,当某个表删除之后,实际上它并没有被彻底删除(仅仅时在数据字典中被除名),而是把该表放到了回收站中,这样当用户需要还原该表时,就可以使用FLASHBACK TABLE(闪回)进行还原。

  • 修改表状态

   用户可以将表置于READ ONLY(只读)状态。处于该状态的表不能执行DML和某些DDL操作。

ALTER TABLE tab_name READ ONLY;
ALTER TABLE tab_name READ WRITE;

数据完整性和约束性

   数据库不仅仅是存储数据,它还必须保证所有存储数据的正确性,因为只有正确的数据才能提供有价值的信息。如果数据不准确或不一致,那么改数据的完整性就可能受到破坏,从而对数据库本身的可靠性带来问题。为了维护数据库中数据的完整性,在创建表时常常需要定义一些约束。约束可以限制列的取值范围,强制列的取值来自合理的范围。

  1. 非空约束

  非空约约束就是限制必须为某个列提供值。空值(NULL)是不存在值,它既不是数字0,也不是空字符串,而是不存在、未知的情况。

     2.主键约束

  主键约束用于唯一地标识表中的每一行记录。在一个表中,最多只能有一个主键约束,主键约束既可以由一个列组成,也可以由两个或两个以上的列组成(这种称为联合主键)。对于表中的每一行数据,主键约束列都是不同的,主键约束同时也具有非空约束的特性。

  如果主键约束由一列组成时,该主键约束被称为行级约束。如果主键约束由两个或两个以上的列组成时,则该主键约束被称为表级约束。若要设置某个或某些列为主键约束,通常使用CONSTRAINT…PRIMARY KEY语句来定义。

     3.唯一约束

  唯一性(UNIQUE)约束强调所在的列不允许有相同的值。但是,它的定义要比主键约束弱,即它所在的列允许空值(但主键约束列是不允许为空值的)。唯一性约束的主要作用是在保证除主键列外,其它列值的唯一性。

  在一个表中,根据实际情况可能有多个列的数据都不允许存在相同值。例如,各种“会员表”的QQ、Email等列的值是不允许重复的(但用户可能不提供,这样就必须允许为空值),但是由于在一个表中最多只能由一个主键约束存在,那么如何解决这种多个列都不允许重复数据存在的问题呢?这就是唯一性约束的作用。若要设置某个列为UNIQUE约束,通常使用CONSTRAINT…UNIQUE标记该列。

     4.外键约束

  外键约束比较复杂,一般的外键约束会使用两个表进行关联(当然也存在同一个表自连接的情况)。外键是指“当前表”(即外键表)引用“另外一个表”(即被引用表)的某个列或某几个列,而“另外一个表”中被引用的列必须具有主键约束或者唯一性约束。在“另外一个表”中,被引用列中不存在的数据不能出现在“当前表”对应的列中。一般情况下,当删除被引用表中的数据时,该数据也不能出现在外键表的外键列中。如果外键列存储了被引用表中将要被删除的数据,那么对被引用表的删除操作将失败。
  最典型的外键约束时HR模式中的EMPLOYEES和DEPARTMENT表,在该外键约束中,外键表EMPLOYEES中的外键列DEPARTMENT_ID将引用被引用表DEPARTMENTS中的DEMPARTMENT_ID列,而该列也是DEPARTMENTS表的主键。

另外,在定义外键约束时,还可以通过关键字ON指定引用行为的类型(级联操作)。当尝试删除被引用表中的一条记录时,通过引用行为可以确定如何处理外键表中的外键列。引用行为的类型包含三种:

  • NO ACTION(默认),违反外键约束时,该操作将被禁止
  • SET NULL 违反外键约束时,外键表中外键列置为NULL,前提:外键字段允许为NULL
  • CASCADE 级联删除,外键表中对应的数据也将删除

5.检查约束

  检查约束一般约定列取值范围,用于业务逻辑检查,比如余额大于0,性别必须为男或女等。

管理约束

  约束创建后,如果没有经过特殊处理,就一直起作用,但也可以根据实际需要,临时禁用某个约束。当某个约束被禁用后,该约束就不再起作用了,但它还存在数据库中。

  那么,为什么要禁用约束呢?这是因为约束的存在会降低插入和更改数据的效率,系统必须确认这些数据是否满足定义的约束条件。当执行一些特殊操作时(比如,使用SQL*Loader从外部数据源向表中导入大量数据,并且知道这些数据是满足约束条件的),为提高运行效率,就可以禁用这些约束。

  1.在定义约束时禁用

  在使用CREATE TABLE或ALTER TABLE语句定义约束时(默认情况下约束是激活的),如果在定义约束时使用关键字DISABLE,则约束是被禁用的。

age int CONSTRAINT CK_AGE CHECK(age > 0 AND age < 200) DISABLE

  2.禁用已经存在的约束

  对于已存在的约束,则可以使用ALTER TABL…DISABLE CONSTRAINT语句禁止该约束。

禁用约束只是一种暂时现象,在特殊处理完毕之后,还应该及时激活约束。

ALTER TABLE tab_name ENABLE [NOVALIDATE] CONSTRAINT con_name;

       3.删除约束

  如果不再需要某个约束时,则可以将其删除。可以使用带DROP CONSTRAINT子句的ALTER TABLE语句删除约束。删除约束与禁用约束不同,禁用的约束时可以激活的,但是删除的约束在表中就完全消失了。使用ALTER TABLE语句删除约束的语法格式如下:

ALTER TABLE table_name DROP CONSTRAINT con_name;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值