数据表
数据表(通常简称表)是Oracle数据库中主要的数据存储容器,表中的数据被组织成行和列。表中的每个列均有一个名称,并且每个列都具有一个指定的数据类型和大小,比如,VARCHAR(30),TIMESTAMP(6)或NUMBER(12)。
在关系型数据库中,表可以对应于现实世界中的实体(如,雇员、岗位等)或联系(如,雇员工资)。在进行数据库设计时,需要首先设计E-R图(实体联系图),然后再将E-R图转变为数据库中的表。
从用户的角度来看,数据表的逻辑结构是一张由行列组成的二维表。表通过行和列来组织数据。通常称表中的一行为一条记录,表中的一列为属性列。一条记录描述一个实体,一个属性列描述实体的一个属性,如,雇员有雇员编号、雇员姓名、雇员岗位等属性;学生有学生编号、姓名、所在学校等属性。每个列都具有列名、列数据类型、列长度,可能还有约束条件、默认值等,这些内容在创建表时即被确定。
在Oracle中,有多种类型的表。不同类型的表各有一些特殊的属性。适应于保存某种特殊的数据、进行某些特殊的操作,即在某些方面可能比其他类型的表的性能更好,如处理速度更快、占用磁盘空间更少。
表一般指的是一个关系表,也可以生成对象表及临时表。其中,对象表是通过用户定义的数据类型生成的,临时表用于存储专用于某个事务或者会话的临时数据。
system给peppa用户授权
grant connect,resource to peppa; conn peppa;
创建数据表
实际上通过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数据表中的一个伪列,它是数据表中每行数据内在的唯一的标识。
-- 创建学生表 CREATE TABLE student( stu_id int(11) NOT NULL, stu_no char(11) NOT NULL, stu_name varchar2(20) NOT NULL, stu_birth date DEFAULT NULL, stu_gender char(6) DEFAULT 'MALE', stu_hobby varchar2(20) DEFAULT NULL ) -- 创建课程表 CREATE TABLE course( cou_id int(11) , cou_name varchar2(20) NOT NULL, cou_date date DEFAULT NULL, cou_credit int(2) DEFAULT NULL ) -- 创建学生选课记录表 CREATE TABLE score ( sc_id int(11), stu_id int(11) DEFAULT NULL, cou_id int(11) DEFAULT NULL, cou_date date DEFAULT NULL, score tinyint(4) DEFAULT NULL )
数据表的特性
1.存储参数 可用于:表空间、回滚段、表、索引、分区、快照、快照日志
当用户在Oracle中创建表时,Oracle允许用户指定该表如何使用磁盘上的存储空间。如果仅为表指定了表空间,而没有设置存储参数,则该表将采用其所属表空间的默认存储参数。
参数名称 | 缺省值 | 最小值 | 最大值 | 说明 |
INITIAL | 5(数据块) | 2(数据块) | 操作系统限定 | 分配给Segment的第一个Extent的大小,以字节为单位,这个参数不能在alter语句中改变,如果指定的值小于最小值,则按最小值创建。 |
NEXT | 5(数据块) | 1(数据块) | 操作系统限定 | 第二个Extent的大小等于NEXT的初值,以后的NEXT值=前一NEXT大小乘以(1+PCTINCREASE/100),如果指定的值小于最小值,则按最小值创建。 如果在alter语句中改变NEXT的值,则下一个分配的Extent将具有指定的大小,而不管上一次分配的Extent大小和PCTINCREASE参数值。 |
MINEXTENTS | 1(Extent) 回滚段为2个Extent |
1(Extent) 回滚段为2个Extent |
操作系统限定 | Segment第一次创建时分配的Extent数量 |
MAXEXTENTS | 根据数据块大小而定 | 1(Extent) 回滚段为2个Extent |
无限制 | 随着Segment中数据量的增长,最多可分配的Extent数量 |
PCTINCREASE | 50% (Oracle8 16中为0%) |
0% | 操作系统限定 | 指定第三个及其后的Extent相对于上一个Extent所增加的百分比, 如果PCTINCREASE为0,则Segment中所有新增加的Extent的大小都相同,等于NEXT的值, 如果PCTINCREASE大于0,则每次计算NEXT的值(用上面的公式), PCTINCREASE不能为负数。 创建回滚段时,不可指定此参数,回滚段中此参数固定为0。 |
OPTIMAL | ---- | 不能小于回滚段初始分配空间 | 操作系统限定 | 仅与回滚段有关,当回滚段因为增长、扩展而超过此参数的设定范围时,Oracle系统会根据情况动态地重新分配Extents,试图收回多分配的Extent。 |
FREELISTS | 1 | 1 | 数据块大小限制 | 只能在CREATE TABLE、CLUSTER、INDEX中指定FREELISTS和FREELIST GROUPS参数。 模式对象中每一个自由列表组中自由列表的数量 |
FREELIST GROUPS | 1 | 1 | 取决于Oracle并行实例的数量 | 用户创建的数据库对象的自由列表组的数量,只有用OPS并行服务器选项时才使用这一参数,一个实例对应一个组。 |
BUFFER_POOL | ---- | ---- | ---- | 给模式对象定义缺省缓冲池(高速缓存),该对象的所有块都存储在指定的高速缓存中,对于表空间或回滚段无效。 |
- oracle存储模式:
- 数据块(block):也叫逻辑块或ORACLE块,它是数据库进行I/O的最小单位。一个数据库块对应硬盘上的一个或多个物理块,它决定于建库时所使用的初始化参数DB_BLOCK_SIZE。数据库块的大小也决定了SGA中每一个数据库缓冲区的大小。
- 范围(extent):范围是数据库存储空间分配的逻辑单位,它由一组连续的数据块所组成。当数据库的对象(如表、列等)增长时,空间就被分配给范围。
- 段(segment): 是由一个或多个范围组成的范围集,它包含一个表空间内特定逻辑存储结构的所有数据。一个段是一个能被建立的逻辑结构,它占有存储,并且能增长,当一个段中的所有空间被用完时,ORACLE就分配它一个新的范围,但是一个段不能跨越表空间。
- 表空间(tablespace):一个数据库从逻辑上来说是由一个或多个表空间所组成,表空间是数据库中物理编组的数据仓库。每一个表空间是由段所组成,一个表空间存放一个或多个数据库的物理文件。一个数据库中的数据被逻辑地存储在表空间上
2.数据块管理参数
对于一般不带有LOB类型的数据表而言,一个数据块可以存放表的多行记录,用户可以设置的数据块管理参数主要分为以下两类。
(1)PCTFREE和PCTUSED
(2)INITRANS参数:指定一个数据块所允许的并发事务数目。
3.重做日志参数
重做日志记录了数据库中数据的改变情况,这样,如果发生故障导致数据不能从内存中写入到数据文件中时,就可以从重做日志中获取被操作的数据。这样就可以防止数据丢失,从而提高表中数据的可靠性。
4.缓存参数
当在Oracle中执行全表搜索时,读入缓存中的数据块将会存储在LRU列表的最近最少使用的一端。这意味着如果进行查询操作,并且必须向缓存中存储数据时,就会将刚读入的数据块换出缓存。
维护数据表
在创建表后,如果发现对表的定义有不满意的地方,可以对表进行修改。普通用户只能对自己模式中的表进行修改,如果要对任何模式中的表进行修改操作,用户必须具有ALTER ANY TABLE系统权限。
- 新增字段
ALTER TABLE tab_name ADD column_name property; -- 在学生表中添加省份province字段 ALTER TABLE student ADD province VARCHAR2(10);
- 删除字段
ALTER TABLE tab_name DROP COLUMN col_name; --删除学生表中province字段 ALTER TABLE student DROP COLUMN province;
- 修改字段
除了在表中增加和删除字段外,还可以根据实际情况修改字段的有关属性,包括修改字段的数据类型的长度、数字列的精度、列的数据类型和列的默认值等。修改字段通常使用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(闪回)进行还原。
--1、查看被删除的数据表 --2、通过数据字典视图RECYCLEBIN来了解该表是否在回收站中‘ SELECT object_name,original_name FROM RECYCLEBIN; --3、使用闪回技术恢复被删除的表 FLASHBACK TABLE .. --4、再次查看
- 修改表状态
用户可以将表置于READ ONLY(只读)状态。处于该状态的表不能执行DML和某些DDL操作。
ALTER TABLE tab_name READ ONLY; ALTER TABLE tab_name READ WRITE;
数据完整性和约束性
数据库不仅仅是存储数据,它还必须保证所有存储数据的正确性,因为只有正确的数据才能提供有价值的信息。如果数据不准确或不一致,那么改数据的完整性就可能受到破坏,从而对数据库本身的可靠性带来问题。为了维护数据库中数据的完整性,在创建表时常常需要定义一些约束。约束可以限制列的取值范围,强制列的取值来自合理的范围。
- 非空约束
非空约约束就是限制必须为某个列提供值。空值(NULL)是不存在值,它既不是数字0,也不是空字符串,而是不存在、未知的情况。
-- 建表时指定某些列非空约束 --使用ALTER语句添加及删除非空约束
2.主键约束
主键约束用于唯一地标识表中的每一行记录。在一个表中,最多只能有一个主键约束,主键约束既可以由一个列组成,也可以由两个或两个以上的列组成(这种称为联合主键)。对于表中的每一行数据,主键约束列都是不同的,主键约束同时也具有非空约束的特性。
如果主键约束由一列组成时,该主键约束被称为行级约束。如果主键约束由两个或两个以上的列组成时,则该主键约束被称为表级约束。若要设置某个或某些列为主键约束,通常使用CONSTRAINT…PRIMARY KEY语句来定义。
-- 建表时行级约束 -- 建表时表级约束 -- ALTER
3.唯一约束
唯一性(UNIQUE)约束强调所在的列不允许有相同的值。但是,它的定义要比主键约束弱,即它所在的列允许空值(但主键约束列是不允许为空值的)。唯一性约束的主要作用是在保证除主键列外,其它列值的唯一性。
在一个表中,根据实际情况可能有多个列的数据都不允许存在相同值。例如,各种“会员表”的QQ、Email等列的值是不允许重复的(但用户可能不提供,这样就必须允许为空值),但是由于在一个表中最多只能由一个主键约束存在,那么如何解决这种多个列都不允许重复数据存在的问题呢?这就是唯一性约束的作用。若要设置某个列为UNIQUE约束,通常使用CONSTRAINT…UNIQUE标记该列。
-- 建表时 -- ALTER
4.外键约束
外键约束比较复杂,一般的外键约束会使用两个表进行关联(当然也存在同一个表自连接的情况)。外键是指“当前表”(即外键表)引用“另外一个表”(即被引用表)的某个列或某几个列,而“另外一个表”中被引用的列必须具有主键约束或者唯一性约束。在“另外一个表”中,被引用列中不存在的数据不能出现在“当前表”对应的列中。一般情况下,当删除被引用表中的数据时,该数据也不能出现在外键表的外键列中。如果外键列存储了被引用表中将要被删除的数据,那么对被引用表的删除操作将失败。
最典型的外键约束时HR模式中的EMPLOYEES和DEPARTMENT表,在该外键约束中,外键表EMPLOYEES中的外键列DEPARTMENT_ID将引用被引用表DEPARTMENTS中的DEMPARTMENT_ID列,而该列也是DEPARTMENTS表的主键。
-- 示例 -- 如果外键表的外键列与被引用列列名相同,则可以省略references关键字后面的列名称。 --
另外,在定义外键约束时,还可以通过关键字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
禁用约束只是一种暂时现象,在特殊处理完毕之后,还应该及时激活约束。
ALTER TABLE tab_name ENABLE [NOVALIDATE] CONSTRAINT con_name; -- NOVALIDATE表示在激活约束时不验证表中已经存在的数据是否满足约束
3.删除约束
如果不再需要某个约束时,则可以将其删除。可以使用带DROP CONSTRAINT子句的ALTER TABLE语句删除约束。删除约束与禁用约束不同,禁用的约束时可以激活的,但是删除的约束在表中就完全消失了。使用ALTER TABLE语句删除约束的语法格式如下:
ALTER TABLE table_name DROP CONSTRAINT con_name;