Oracle基础——第五章 表的实现

本章目标

 

数据完整性

创建表

修改表

添加、修改、删除列

添加、删除约束

启用、禁用约束

删除表

 

数据完整性

 

1.        数据完整性

a)        存储在数据库中的所有数据值均正确的状态。

如果数据库中存储有不正确的数据值,则该数据库称为已失去数据完整性。

b)        数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)

它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。

c)        

2.        数据完整性-1

a)        数据类型

年龄使用什么类型?

b)        格式是否正确

身份证号,可以是15位也可以是18

c)        范围

性别可选择“男”、“女”、“未知”

d)        是否允许重复

银行卡号不允许重复

e)        特定业务要求

银行贷款

3.        数据完整性-2

a)        实体完整性

b)        域完整性

c)        引用完整性

d)        自定义完整性

4.        实体完整性

a)        实体完整性

实体完整性要求每一个表中的主键字段都不能为空或者重复的值。

b)        实现方法

                        i.              唯一约束

                      ii.              主键约束

5.        域完整性

a)        域完整性

域完整性指列的值域的完整性。如数据类型、格式、值域范围、是否允许空值等

b)        实现方法

                        i.              限制数据类型

                      ii.              外键约束

                    iii.              默认值

                     iv.              非空约束

6.        引用完整性

a)        引用完整性

                        i.              也称之为参照完整性,当更新、删除、插入一个表中的数据时,通过参照引用相互关联的另一个表中的数据,来检查对表的数据操作是否正确。

                      ii.              引用完整性要求关系中不允许引用不存在的实体。

                    iii.              引用完整性与实体完整性是关系模型必须满足的完整性约束条件。

b)        实现方法

外键约束

7.        自定义完整性

a)        自定义完整性

用户自定义完整性指针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

b)        实现方法

                        i.              存储过程

                      ii.              触发器

8.        选择主键的原则

a)        最少性

尽量选择单个键作为主键

b)        稳定性

尽量选择数值更新少的列作为主键

9.        主外键关系

a)        注意事项

                        i.              当主表中没有对应的记录时,不能将记录添加到子表

                      ii.              不能更改主表中的值而导致子表中的记录孤立

                    iii.              子表存在与主表对应的记录,不能从主表中删除该记录

                     iv.              删除主表前,先删子表

10.    表约束

a)        表约束的目的:确保表中数据的完整性

b)        常用的约束类型:

                        i.              主键约束(PRIMARY KEY):要求主键列数据唯一,并且不允许为空

                      ii.              非空约束(NOT NULL):指定的列的值不允许为空

                    iii.              唯一键约束(UNIQUE):要求该列唯一,允许为空,但只能出现一个空值

                     iv.              检查约束(CHECK):指定表中一列或多列可以接受的数据值格式

                       v.              默认约束(DEFAULT):指定某列的默认值

                     vi.              外键约束(FOREIGN KEY):用于建立和加强两个表数据之间连接的一列或多列。通过将表中的主键列添加到另一个表中。可以创建两个表之间的连接。这个主键的列就称为第二个表的外键。外键约束就可以确保添加到外键表中的任何行都在主表中都存在相应的行

 

创建表

 

1.        语法及说明

a)        语法

CREATE  [GLOBAL TEMPORARY] TABLE table_name (

column_name type [CONSTRAINT constraint_def DEFAULT default_exp]

[, column_name type [CONSTRAINT constraint_def DEFAULT default_exp] ...]

)

[ON COMMIT {DELETE | PRESERVE} ROWS]

TABLESPACE tab_space;

b)        说明

                        i.              GLOBAL TEMPORARY:表示表中的数据行是临时的,表中的数据行保存到什么时候,需要参考OM COMMIT选项

                      ii.              table_name:指定表名

                    iii.              column_name:列名

                     iv.              type:列的类型

                       v.              constraint_def:列的约束

                     vi.              default_exp:指定列的默认值

                   vii.              ON COMMIT:控制临时表中数据行保存的时间。DELETE表示事务结束则表中的数据行被删除。PRESERVE表示表中的数据一直保存到用户会话结束。如果省略OM COMMIT后面的参数,则默认为DELETE

                 viii.              tab_space:指定表存放的表空间。如果没有指定的话,则存放在当前用户的默认表空间

c)        

2.        案例

a)        创建表

CREATE TABLE order_status2 (

  id INTEGER CONSTRAINT order_status2_pk PRIMARY KEY,

  status VARCHAR2(10),

  last_modified DATE DEFAULT SYSDATE

);

b)        例如

CREATE GLOBAL TEMPORARY TABLE order_status_temp (

  id INTEGER,

  status VARCHAR2(10),

  last_modified DATE DEFAULT SYSDATE

)

ON COMMIT PRESERVE ROWS;

                        i.              插入数据

INSERT INTO order_status_temp (id, status)

VALUES (1, 'New');

                      ii.              说明

1.        创建临时表order_status_temp,表中的数据将会保存到直到用户结束会话,表中的数据将会被清除

2.        插入数据成功之后,进行查询;断开会话,重新登录进行查询

3.        获取表的相关信息

a)        使用DESCRIBE命令查看某张表的信息

b)        查询USER_TABLES视图获取表的相关信息

c)        案例

                        i.              例如

SELECT table_name, tablespace_name, temporary

FROM user_tables;

                      ii.              注意:

1.        由于ORDER_STATUS_TEMP表是临时表,在最后一列使用Y表示

2.       table_name:表示表名

3.       tablespace_name:该表存储的表空间的名称。表空间是数据库用来存储对象的区域,如表。

4.       temporary:表示该表是否是临时的,Y表示是临时表,否则为N

4.        获取表中列的信息

a)        可以通过查看user_tab_columns视图,查看表的列相关信息,例如

SELECT table_name,column_name, data_type, data_length, data_precision, data_scale

FROM user_tab_columns;

 

Oracle基础——第五章 表的实现_第1张图片

5.       user_tab_columns字段说明

a)       user_tab_columns视图中的某些列

                        i.              table_name

表名

                      ii.              column_name

列名

                    iii.              data_type

列的数据类型

                     iv.              data_length

数据长度

                       v.              data_precision

数字列的精度

                     vi.              data_scale

小数点后位数

 

修改表

 

1.        增加列

a)        给order_status2表增加一列

ALTER TABLE order_status2

ADD modified_by INTEGER;

b)        给order_status2表增加一列,指定默认值

ALTER TABLE order_status2

ADD initially_created DATE DEFAULT SYSDATE NOT NULL;

c)        使用DESCRIBE命令验证添加结果

DESCRIBE order_status2;

d)        显示效果如下图所示:

 

Oracle基础——第五章 表的实现_第2张图片

2.        增加虚拟列

a)       Oracle 11g允许添加虚拟列,虚拟列可以引用表中已存在的列。

b)        例如,现有表salary_grades,并有如下数据

CREATE TABLE salary_grades (

  salary_grade_id INTEGER CONSTRAINT salary_grade_pk PRIMARY KEY,

  low_salary NUMBER(6, 0),

  high_salary NUMBER(6, 0)

);

INSERT INTO salary_grades VALUES (1, 1, 250000);

INSERT INTO salary_grades VALUES (2, 250001, 500000);

INSERT INTO salary_grades VALUES (3, 500001, 750000);

INSERT INTO salary_grades VALUES (4, 750001, 999999);

c)        给表salary_grades添加虚拟列

ALTER TABLE salary_grades

ADD (average_salary AS ((low_salary + high_salary)/2));

d)        查看表结构及表中数据

DESCCRIBE salary_grades;

SELECT * FROM salary_grades;

 

Oracle基础——第五章 表的实现_第3张图片

3.        修改列

a)        修改列的大小

ALTER TABLE order_status2

MODIFY status VARCHAR2(15);

b)        修改数字列精度

ALTER TABLE order_status2

MODIFY id NUMBER(5);

c)        修改数据类型

ALTER TABLE order_status2

MODIFY status CHAR(15);

d)        修改默认值

ALTER TABLE order_status2

MODIFY last_modified DEFAULT SYSDATE - 1;

4.        给列重命名

a)        语法

ALTER TABLE <table_name>

RENAME COLUMN <old_col_name> TO <new_col_name>

b)        例如

                        i.              修改order_status2表的last_modified列名为modified

ALTER TABLE order_status2

RENAME COLUMN last_modified TO modified;

                      ii.              执行效果图如下表所示:

 

Oracle基础——第五章 表的实现_第4张图片

5.        删除列

a)        使用ALTER TABLE进行列的删除,如下

ALTER TABLE order_status2

DROP COLUMN initially_created;

6.       CHECK约束

a)        添加CHECK约束

ALTER TABLE order_status2

ADD CONSTRAINT order_status2_status_ck

CHECK (status IN ('PLACED', 'PENDING', 'SHIPPED'));

b)        测试数据

                        i.              正确数据

INSERT INTO order_status2(id, status, last_modified, modified_by)

VALUES (1,'PENDING','01-1-2005',1);

                      ii.              错误数据

INSERT INTO order_status2(id, status, last_modified, modified_by)

VALUES(2, 'CLEARED','01-1-2005',2);

提示错误:ORA-02290:违反检查约束条件 (STORE.ORDER_STATUS2_STATUS_CK)

7.        非空约束

a)        给status列添加非空约束

ALTER TABLE order_status2

MODIFY status CONSTRAINT order_status2_status_nn NOT NULL;

b)        给modified_by列添加非空约束

ALTER TABLE order_status2

MODIFY modified_by CONSTRAINT order_status2_modified_by_nn NOT NULL;

c)        给last_modified列添加非空约束,不指定约束名

ALTER TABLE order_status2

MODIFY last_modified NOT NULL;

8.        外键约束

a)        添加外键约束

b)        现有employees

CREATE TABLE employees (

  employee_id INTEGER CONSTRAINT employees_pk PRIMARY KEY,

  manager_id INTEGER,

  first_name VARCHAR2(10) NOT NULL,

  last_name VARCHAR2(10) NOT NULL,

  title VARCHAR2(20),

  salary NUMBER(6, 0)

);

c)        先删除order_status2表中的modified_by

ALTER TABLE order_status2

DROP COLUMN modified_by;

d)        给order_status2表添加FOREIGN KEY约束,引用employees表中的employee_id列。

ALTER TABLE order_status2

ADD CONSTRAINT order_status2_modified_by_fk

modified_by REFERENCES employees(employee_id);

e)        同样,在创建外键约束时可以添加ON DELETE CASCADE选项,那么当主表的数据被删除时,子表对应的行同样也自动被删除。例如

f)        --重新删除modified_by

ALTER TABLE order_status2

DROP COLUMN modified_by;

g)       --重新添加外键约束

ALTER TABLE order_status2

ADD CONSTRAINT order_status2_modified_by_fk

modified_by REFERENCES employees(employee_id) ON DELETE CASCADE;

h)        在创建外键约束时可以添加ON DELETE SET NULL选项,那么当主表的数据被删除时,子表匹配的相关行的列会被设置为NULL值,而不是被删除

i)          例如

j)          删除modified_by

ALTER TABLE order_status2

DROP COLUMN modified_by;

k)        设置外键

ALTER TABLE order_status2

ADD CONSTRAINT order_status2_modified_by_fk

modified_by REFERENCES employees(employee_id) ON DELETE SET NULL;

9.        唯一约束

a)        以下ALTER TABLE语句给order_status2表的status列添加UNIQUE约束

ALTER TABLE order_status2

ADD CONSTRAINT order_status2_status_uq UNIQUE (status);

b)        在往order_status2表中添加任意行时,行的status列的值必须要唯一。

10.    修改约束

a)        删除约束

b)        通过ALTER TABLEDROP CONSTRAINT选项删除约束

ALTER TABLE order_status2

DROP CONSTRAINT order_status2_status_uq;

c)        停用约束

d)        约束在创建完之后就生效了,也可以在创建时在CONSTRAINT关键字末尾加DISABLE关键字,默认停用它。

ALTER TABLE order_status2

ADD CONSTRAINT order_status2_status_uq UNIQUE (status) DISABLE;

e)        也可以停用已经启用的约束,例如约束order_status2_status_nn

ALTER TABLE order_status2

DISABLE CONSTRAINT order_status2_status_nn;

f)         启用约束

g)        可以使用ALTER TABLEENABLE CONSTRAINT选项将已存在的约束失效启用。例如

ALTER TABLE order_status2

ENABLE CONSTRAINT order_status2_status_uq;

h)        说明

在启用约束时,表中所有的数据行的数据必须要满足这个约束。

i)          也可以通过设置ENABLE NOVALIDATE,对新的数据行增加约束

ALTER TABLE order_status2

ENABLE NOVALIDATE CONSTRAINT order_status2_status_uq;

j)          说明

默认是ENABLE VALIDATE,对存在的数据行也要求符合约束

11.    延迟约束

a)        延迟约束(Deferred Constraint)就是在事务提交的时候才生效

                        i.              可以在约束中加DEFERRABLE选项

                      ii.              约束一旦创建之后就不能将其改为DEFERRABLE,必须删除重新创建

                    iii.              创建DEFERRABLE约束时,可以使用INITIALLY IMMEDIATEINITIALLY DEFERRED

1.       INITIALLY IMMEDIATE:表示添加、更新或删除时都进行数据的合法性验证(默认情况)

2.       INITIALLY DEFERRED:表示只有事务提交时,才进行数据的合法性验证

b)        案例

                        i.              给order_status2表的唯一约束设置成延迟的

                      ii.              先删除order_status2表的唯一约束

ALTER TABLE order_status2

DROP CONSTRAINT order_status2_status_uq;

                    iii.              添加唯一约束

ALTER TABLE order_status2

ADD CONSTRAINT order_status2_status_uq UNIQUE (status)

DEFERRABLE INITIALLY DEFERRED;

12.    查看约束信息

a)        可以通过user_constraints视图查看约束信息

b)        查看order_status2表的约束信息

SELECT constraint_name, constraint_type, status, deferrable, deferred

FROM user_constraints

WHERE table_name = 'ORDER_STATUS2';

c)        显示效果如下图所示

在下列约束中,有2个约束名是数据库自动分配的。

 

Oracle基础——第五章 表的实现_第5张图片

13.    查看列约束信息

a)        通过查看user_cons_columns视图,了解列的约束信息

b)        视图相关列的说明

                        i.              owner:约束的拥有者

                      ii.              constraint_name:约束名

                    iii.              table_name:约束所在的表

                     iv.              column_name:约束定义所在的列

c)       user_cons_columns视图

从视图中查询order_status2表中列的约束信息

SELECT owner,constraint_name,table_name,column_name

FROM user_cons_columns

WHERE table_name='ORDER_STATUS2';

查询效果如下图所示:

 

Oracle基础——第五章 表的实现_第6张图片

16.    重新命名表名

a)        可以使用RENAME语句对表进行重命名

b)        例如

RENAME order_status2 TO order_state;

c)        运行效果图如下所示:

 

d)        重新将表名恢复

RENAME order_state TO order_status2;

15.    给表添加备注

a)        给表或列添加备注,可以帮助用户理解表或列的作用。

                        i.              给表或列添加备注可以使用COMMENT语句

                      ii.              例如,给表添加备注

COMMENT ON TABLE order_status2 IS

'存储订单状态信息';

b)        例如,给列条件备注

COMMENT ON COLUMN order_status2.last_modified IS

'存储订单最后修改时间';

16.    查看表备注

a)        查看表的备注

b)        可以从user_tab_comments视图中查看表的备注信息

SELECT *

FROM user_tab_comments;

c)        查询效果如下图所示:

 

Oracle基础——第五章 表的实现_第7张图片

17.    查看列备注

a)        查看列的备注

b)        可以从user_col_comments视图中查看列的备注信息

SELECT *

FROM user_col_comments

WHERE table_name = 'ORDER_STATUS2';

c)        查询效果如下图所示:

 

Oracle基础——第五章 表的实现_第8张图片

18.    TRUNCATE TABLE

a)        截断表使用TRUNCATE语句

b)        这个操作会从表中删除所有的行和重置表的存储区域。

c)        例如,截断order_status2

TRUNCATE TABLE order_status2;

d)        操作效果如下图所示:

 

e)        说明

                        i.              如果要删除表中所有的数据使用TRUNCATEDELETE效果要好。因为TRUNCATE会为新的数据行重置存储区域,而且它删除时不需要占用数据库撤销空间,也不需要使用COMMIT进行提交。

19.    删除表

a)        如果要删除表的话,可以使用DROP TABLE语句

b)        例如,删除order_status2

DROP TABLE order_status2;

c)        操作效果如下图所示:

 

 

本章总结

 

数据完整性

创建表

修改表

删除表

 

 

Oracle基础——第五章 表的实现_第9张图片 Oracle基础——第五章 表的实现_第10张图片  Oracle基础——第五章 表的实现_第11张图片
@Wentasy 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。原创博文如需转载请注明出处,谢谢 :) [CSDN博客]

你可能感兴趣的:(oracle基础,第五章,表的实现)