Oracle 表及相关对象的创建与管理

Ø  简介

我们知道,在 Oracle 中的表相关对象主要包括:表、视图、索引、序列、同义词等。这些对象是我们经常会接触到的,下面就展开对这些对象的学习,包括如下内容:

1.  

2.   视图

3.   索引

4.   序列

5.   同义词

 

1.  

1)   创建表

u   语法:

create table [schema,] table_name(

  column_name data_type [constraints]

  [,column_name data_type [constraints]

);

参数说明:

[]表示为可选的,否则为必须。解释如下:

scheme: 指定表所属的用户名或者所属的用户模式名称;

table_name: 顾名思义,表名;

column_name: 列名;

data_type: 列的数据类型;

constraints: 约束,可以是多个。

 

提示:创建数据表也可以采用 PL/SQL Developer 工具可视化创建,该工具只是帮我们根据表的设置,自动生成了创建表的 SQL 语句。不建议使用该方式,因为可控性或维护性较差。

 

首先,我们创建一张外键表(部门表):

CREATE TABLE T_DEPT(

  DEPTID NUMBER(8) NOT NULL,

  DNAME VARCHAR2(20),

  CONSTRAINT PK_T_DEPT_DEPTID PRIMARY KEY(DEPTID)

);

 

1.   创建员工表,并添加键和约束(方式一:系统自动命名)

CREATE TABLE T_EMP(

  EMPID NUMBER(8) NOT NULL PRIMARY KEY,                   --主键,系统自动命名,例如:SYS_C0014011

  DEPTID NUMBER(8) NOT NULL REFERENCES T_DEPT(DEPTID),    --外键,系统自动命名,例如:SYS_C0014013

  IDNUMBER CHAR(18) NOT NULL UNIQUE,                      --唯一键,系统自动命名,例如:SYS_C0014012

  SEX NUMBER(1) NOT NULL CHECK(SEX IN(0,1,2)),            --检查约束,系统自动命名,例如:SYS_C0014010

  AGE NUMBER(2) DEFAULT(22),                              --默认约束

  ENAME VARCHAR2(20) NOT NULL                             --非空约束

);

n  注意:

1)   被外键关联的表(T_DEPT)的字段(DEPTID),必须为主键或唯一键,想想也是如此(注意思考);

2)   具有默认约束的列,可以省略非空约束;

3)   默认约束不能指定约束名,而非空约束可以,但意义不大(例如:ENAME VARCHAR2(20) CONSTRAINT CON_T_EMP_ENAME NOT NULL);

 

2.   创建员工表,并添加键和约束(方式二:手动命名)

CREATE TABLE T_EMP(

  EMPID NUMBER(8) NOT NULL CONSTRAINT PK_T_EMP_EMPID PRIMARY KEY,                 --主键,名称:PK_T_EMP_EMPID

  DEPTID NUMBER(8) NOT NULL CONSTRAINT FK_T_EMP_DEPTID REFERENCES T_DEPT(DEPTID), --外键,名称:FK_T_EMP_DEPTID

  IDNUMBER CHAR(18) NOT NULL CONSTRAINT UQ_T_EMP_IDNUMBER UNIQUE,               --唯一键,名称:UQ_T_EMP_IDNUMBER

  SEX NUMBER(1) NOT NULL CONSTRAINT CK_T_EMP_SEX CHECK(SEX IN(0,1,2)),            --检查约束,名称:CK_T_EMP_SEX

  AGE NUMBER(2) DEFAULT(22)                                                       --默认约束

);

 

3.   创建员工表,并添加键和约束(方式三:手动命名)推荐:可读性好

CREATE TABLE T_EMP(

  EMPID NUMBER(8) NOT NULL,

  ENAME VARCHAR2(20) NOT NULL,

  DEPTID NUMBER(8) NOT NULL,

  IDNUMBER CHAR(18) NOT NULL,

  SEX NUMBER(1) NOT NULL,

  AGE NUMBER(2) DEFAULT(22),                                                      --默认约束,系统自动命名,例如:SYS_C0014008

  CONSTRAINT PK_T_EMP_EMPID PRIMARY KEY(EMPID),                                   --主键,名称:PK_T_EMP_EMPID

  CONSTRAINT FK_T_EMP_DEPTID FOREIGN KEY(DEPTID) REFERENCES T_DEPT(DEPTID),       --外键,名称:FK_T_EMP_DEPTID

  CONSTRAINT UQ_T_EMP_IDNUMBER UNIQUE(IDNUMBER),                                --唯一键,名称:UQ_T_EMP_IDNUMBER

  CONSTRAINT CK_T_EMP_SEX CHECK(SEX IN(0,1,2))                                    --检查约束,名称:CK_T_EMP_SEX

);

 

4.   拷贝表

CREATE TABLE Table05 AS SELECT * FROM Table02;        --如果不需要拷贝数据,加上 1<>1 的条件即可

 

2)   修改表结构(ALTER TABLE)

1.   修改表名

RENAME table_name TO new_table_name;

 

2.   添加键和约束

ALTER TABLE T_EMP ADD CONSTRAINT PK_T_EMP_EMPID PRIMARY KEY(EMPID);               --添加主键,名称:PK_T_EMP_EMPID

ALTER TABLE T_EMP ADD CONSTRAINT FK_T_EMP_DEPTID FOREIGN KEY(DEPTID) REFERENCES T_DEPT(DEPTID); --添加外键,名称:FK_T_EMP_DEPTID

ALTER TABLE T_EMP ADD CONSTRAINT UQ_T_EMP_IDNUMBER UNIQUE(IDNUMBER);            --添加唯一键,名称:UQ_T_EMP_IDNUMBER

ALTER TABLE T_EMP ADD CONSTRAINT CK_T_EMP_SEX CHECK(SEX IN(0,1,2));               --添加检查约束,名称:CK_T_EMP_SEX

ALTER TABLE T_EMP MODIFY(AGE NUMBER(2) DEFAULT(22));                              --添加默认约束

ALTER TABLE T_EMP MODIFY(ENAME VARCHAR2(20) NOT NULL);                            --添加非空约束

 

3.   添加联合/复合键

--联合主键

ALTER TABLE TABLE_NAME ADD CONSTRAINT PK_TABLE_NAME_Column1_Column2 PRIMARY KEY(Column1, Column2);

--联合外键

ALTER TABLE TABLE_NAME ADD CONSTRAINT FK_TABLE_NAME_Column1_Column2 FOREIGN KEY(Column1, Column2) REFERENCES TABLE_NAME(Column1, Column2);

--联合唯一键

ALTER TABLE TABLE_NAME ADD CONSTRAINT UQ_TABLE_NAME_Column1_Column2 UNIQUE(Column1, Column2);

 

4.   添加列

ALTER TABLE table_name ADD column1 data_type [constraints];

或者一次添加多列:

ALTER TABLE table_name ADD (

          column1 data_type [constraints],

          column2 data_type [constraints]

         

);

 

5.   修改列名

ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name;

 

6.   修改列的类型

ALTER TABLE table_name MODIFY column_name data_type;

 

7.   删除列

ALTER TABLE table_name DROP COLUMN column_name;

 

3)   删除表

1.   基本用法

DROP TABLE table_name;       --Oracle 中只能一次删除一张表,而 SQL Server 中可以同时删除多张表

 

2.   删除表,并删除与之关联的约束(比如:引用该表的外键约束)、视图等

DROP TABLE table_name CASCADE CONSTRAINTS;

 

3.   删除表,并释放资源,不经过回收站

DROP TABLE table_name PURGE;

 

2.   视图

视图可以看做一张虚拟表,它通常用于返回对一张表或多张表的查询结果,取出所需的字段,当作为一些通用的查询时,可以帮我们减少代码量;但同时也增加了对视图的维护成本,比如视图中的表字段进行了修改或删除,视图也需要做相应的更改。

u  语法

CREATE [OR REPLACE] VIEW view_name [(COLUMN_ALIASES)] AS

    defining-query

[WITH READ ONLY]

[WITH CHECK OPTION]

参数说明:

OR REPLACE: 表示该语句具有创建和替换原有视图的能力;

COLUMN_ALIASES: 用于定义视图查询时显示的列名,当然也可以使用 AS 在 SELECT 与 FROM 之间定义列的别名;

defining-query: 定义视图的查询 SELECT 语句,定义了视图的列和数据;

WITH READ ONLY: 防止底层表通过视图进行更改;

WITH CHECK OPTION: 子句保护视图免受对基础表的任何更改,这些更改将生成未包含在定义查询中的行。

 

权限:创建视图的用户必须具有 CREATE VIEW 的系统权限。

 

1)   基本用法

CREATE OR REPLACE VIEW V_EMP

AS

SELECT * FROM EMP WHERE 1=1;

执行查询:

Oracle 表及相关对象的创建与管理

 

2)   指定列的别名

CREATE OR REPLACE VIEW V_EMP(员工编号,姓名)

AS

SELECT EMPNO, ENAME FROM EMP WHERE 1=1;

执行查询:

SELECT * FROM V_EMP;

Oracle 表及相关对象的创建与管理

 

3)   编译视图

ALTER VIEW V_EMP COMPILE;

当视图中引用的表发生改变时,可以使用编译视图来查看是否成功

 

3.   索引

1)   普通索引

CREATE INDEX IDX_T_EMP_ENAME ON T_EMP(ENAME);

 

2)   唯一索引

CREATE UNIQUE INDEX IDX_T_EMP_IDNUMBER ON T_EMP(IDNUMBER);

 

3)   联合索引

CREATE INDEX IDX_T_DEPT_DEPTID_DNAME ON T_DEPT(DEPTID,DNAME);

 

4)   反向键索引

 

4.   序列

u  语法

CREATE SEQUENCE <seq_name>

[START WITH n]

[INCREMENT BY n]

[MINVALUE n | NOMINVALUE]

[MAXVALUE n | NOMAXVALUE]

[CACHE n | NOCACHE]

[CYCLE | NOCYCLE]

[ORDER | NOORDER];

参数说明:

seq_name: 序列名;

START WITH: 设置序列起始值,默认情况下,递增序列起始值为 MINVALUE,递减序列起始值为 MAXVALUE,可选参数,默认为1;

INCREMENT BY: 设置序列的增量,正数表示递增,而负数表示递减。可选参数,默认为1;

MINVALUE: 设置序列生成的最小值,可选参数,默认为 NOMINVALUE(不限制最小值);

MAXVALUE: 设置序列生成的最大值,可选参数,默认为 NOMAXVALUE(不限制最大值);

CACHE: 是否产生序列号预分配,并存储在内存中。数据库异常终止,可能会导致序列中断不连续的情况,默认为20;

CYCLE: 指定序列到达最大值(MAXVALUE)或最小值(MINVALUE)时,是否可复位并继续生成序列。如果为 NOCYCLE,当到达最大值或最小值时,如果再视图获取序列的下一个值将出错;

ORDER: 用于确保序列是按顺序生成的,比如:第一个请求获取1,第二个请求就会获取2,以此类推;如果是 NOORDER,只能保证序列唯一,不能确保序列的顺序。

 

1)   创建序列

CREATE SEQUENCE SEQ_T_DEPT_DEPTID

START WITH 2

INCREMENT BY 2

MAXVALUE 10000

CACHE 10

ORDER;

 

2)   查询序列

SELECT SEQ_T_DEPT_DEPTID.NEXTVAL FROM DUAL; --下一个序列值

SELECT SEQ_T_DEPT_DEPTID.CURRVAL FROM DUAL; --当前序列值

 

3)   使用序列插入数据

INSERT INTO T_DEPT VALUES(SEQ_T_DEPT_DEPTID.NEXTVAL, '研发部');

 

4)   修改序列

ALTER SEQUENCE SEQ_T_DEPT_DEPTID MAXVALUE 9999999;

 

5)   删除序列

DROP SEQUENCE SEQ_T_DEPT_DEPTID;

 

6)   查询所有序列

SELECT * FROM USER_SEQUENCES;

 

7)   解决新表第一次使用新的序列时,序列值为2的问题

原因:从Oracle 11.2.0.1开始,提供了一个"延迟段创建"特性,在做插入时,序列会跳过第一个值1,从而插入的是2。可以采用下面两种办法:

1.   更改数据库的"延时段创建"特性为false(需要相应的权限)

ALTER SYSTEMSET deferred_segment_creation = FALSE;

2.   创建表时让序列立即执行

--系统配置

CREATE TABLE Sys_Config(

  ConfigId NUMBER(16) NOT NULL,                     --配置Id

  ConfigName VARCHAR2(64) NOT NULL,                 --配置名

  ConfigValue VARCHAR2(4000) NOT NULL,              --配置值

  CreateUserId NUMBER(4) NOT NULL,                  --创建人Id

  CreateTime DATE NOT NULL,                         --创建时间

  UpdateUserId NUMBER(4) NULL,                      --修改人Id

  UpdateTime DATE NULL,                             --修改时间

  CONSTRAINT PK_Config_ConfigId PRIMARY KEY(ConfigId),

  CONSTRAINT UQ_Config_ConfigName UNIQUE(ConfigName)

)

SEGMENT CREATION IMMEDIATE;

 

n  注意事项:

1.   调用 SEQ_EMP_ID.CURRVAL 前,必须先初始化,即调用 SEQ_EMP_ID.NEXTVAL;

2.   序列不受事务的控制,也就是回滚事务并不会回滚序列。

 

5.   同义词

语法:

https://baijiahao.baidu.com/s?id=1617567365234678799&wfr=spider&for=pc

https://www.cnblogs.com/wushuang0608/p/8405281.html

https://blog.csdn.net/u013752926/article/details/79869040

上一篇:mfc ui3


下一篇:获取json中的数组