ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据表

2022-05-28 09:01:10  阅读:121  来源: 互联网

标签:-- 约束 数据表 表中 TABLE 数据 ALTER


  数据表(通常简称表)是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;

数据完整性和约束性

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

  1. 非空约束

  非空约约束就是限制必须为某个列提供值。空值(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;

 

标签:--,约束,数据表,表中,TABLE,数据,ALTER
来源: https://www.cnblogs.com/adan-chiu/p/14639711.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有