📜  使用DDL语句

📅  最后修改于: 2020-12-29 04:25:09             🧑  作者: Mango


使用DDL语句创建和管理表

模式是多个数据库对象(称为模式对象)的集合。这些对象可以通过其所有者模式直接访问。下表列出了模式对象。

  • 表-存储数据

  • 查看-从一个或多个表以所需格式投影数据

  • 序列-生成数值

  • 索引-提高表查询的性能

  • 同义词-对象的备用名称

创建数据库的第一步之一就是创建用于存储组织数据的表。数据库设计涉及识别各种组织系统的系统用户需求,例如订单输入,库存管理和应收账款。无论数据库大小和复杂程度如何,每个数据库都由表组成。

创建表

要在数据库中创建表,DBA必须掌握某些信息-表名,列名,列数据类型和列大小。稍后可以使用DDL命令修改所有这些信息。

表命名约定-

  • 您为表选择的名称必须遵循以下标准规则:

  • 名称必须以字母AZ或az开头

  • 可以包含数字和下划线

  • 可以小写

  • 长度上限为30个字符

  • 无法在架构中使用另一个现有对象的相同名称

  • 不得为SQL保留字

按照上述指导原则,’EMP85’可以是有效的表名,但85EMP不是。表类似,由于UPDATE是SQL保留关键字,因此不能选择UPDATE作为表名。

CREATE TABLE语句

CREATE TABLE是一个DDL语句,用于在数据库中创建表。该表将在CREATE TABLE脚本执行后立即创建并准备继续保存数据。用户必须具有CREATE TABLE系统特权才能创建但是要在任何用户的架构中创建表,用户必须具有CREATE ANY TABLE架构。

这是基本CREATE TABLE语句的语法。可能有许多其他子句来显式提供存储规范或段值。

CREATE TABLE [schema.]table 
          ( { column datatype [DEFAULT expr] [column_constraint] ... 
            | table_constraint} 
         [, { column datatype [DEFAULT expr] [column_constraint] ... 
            | table_constraint} ]...) 
         [AS subquery]

在以上语法中,DEFAULT指定默认值,如果忽略该列,则可以在INSERT语句期间使用该默认值。它不能包含对除SYSDATE和USER之外的其他表列或伪列(CURRVAL,NEXTVAL,LEVEL和ROWNUM)的引用,或未完全指定的日期常量。

约束是在列级别或表级别上可选定义的规则(在本章后面介绍)。在对表执行任何数据操作(插入,更新)时,将检查这些规则,并在违反该规则时引发错误以中止该操作。

例如,下面的CREATE TABLE语句创建一个表EMP_TEST。注意列的规格,数据类型和精度。

CREATE TABLE SCOTT.EMP_TEST
(EMPID NUMBER,
ENAME VARCHAR2(100),
DEPARTMENT_ID NUMBER,
SALARY NUMBER,
JOB_ID VARCHAR2(3),
HIREDATE DATE,
COMM NUMBER);

用户可以通过在用户名或模式前添加表名来从其他用户的模式中引用表,例如,用户GUEST希望从SCOTT拥有的EMP_TEST表中查询员工姓名和薪水。他可以发出以下查询-

SELECT  ENAME, SALARY,
FROM     GUEST.EMP_TEST;

在创建表时,列可以保留默认值。它有助于限制NULL值进入列。可以从字面量,表达式或SQL函数推导出默认值,这些函数必须将兼容的数据类型返回到该列。在下面的CREATE TABLE语句中,请注意LOCATION_ID列的默认值为100。

CREATE TABLE SCOTT.DEPARTMENT
(DEPARTMENT_ID NUMBER,
   DNAME VARCHAR2 (100),
   LOCATION_ID NUMBER DEFAULT 100);

CTAS-使用子查询创建表

可以使用子查询选项从数据库中的现有表创建表,该表将复制表结构以及表中的数据。还可以根据条件复制数据。将列数据类型定义(包括显式施加的NOT NULL约束)复制到新表中。

下面的CTAS脚本创建一个新表EMP_BACKUP。部门20的员工数据将复制到新表中。

CREATE TABLE EMP_BACKUP
AS
SELECT * FROM EMP_TEST
WHERE department_id=20;

资料类型

数据类型用于指定表中列的基本行为。从广义上讲,列行为可以属于数字,字符或日期系列。还有多个其他子类型属于这些系列。

号码数据类型

NUMBER数据类型包含整数,定点和浮点数值。Oracle的早期版本为这些不同类型的数字定义了不同的数据类型,但是现在NUMBER数据类型可满足所有这些目的。列必须存储可以在数学计算中使用的数值数据。有时,NUMBER数据类型用于存储标识号,其中这些号由DBMS生成为顺序号。

NUMBER(p,s),其中p是38位数字的精度,s是小数位(小数点右边的位数)。小数位的范围是-84到127。

NUMBER(p)是小数位数为零且精度为p的定点数。

FLOAT [(p)],其中p是二进制精度,范围可以从1到126。如果未指定p,则默认值为二进制126。

日期数据类型

对于每种DATE数据类型,世纪,年,月,日,小时,分钟,秒存储在数据库中。每个数据库系统都有一个默认的日期格式,该格式由初始化参数NLS_DATE_FORMAT定义。此参数通常设置为DD-MON-YY。如果未指定时间,则默认时间为12:00:00 am

字符数据类型

Oracle支持三种预定义的字符数据类型,包括CHAR,VARCHAR,VARCHAR2和LONG.VARCHAR和VARCHAR2实际上是同义词,Oracle建议使用VARCHAR2而不是VARCHAR。当列将存储固定长度的字符值时,请使用CHAR数据类型。例如,美国的社会安全号码(SSN)分配给每个公民,并且大小始终为9个字符(即使SSN严格由数字组成,这些数字也被视为字符),并将其指定为CHAR (9)。使用VARCHAR2数据类型来存储长度可变的字母数字数据,例如,客户名或地址在要存储的字符数方面会有很大差异.VARCHAR2列的最大大小为4,000个字符。

LOB数据类型

Oracle提供了几种不同的LOB数据类型,包括CLOB(字符大对象)和BLOB(二进制大对象)。这些数据类型的列可以存储非结构化数据,包括文本,图像,视频和空间数据.CLOB数据类型最多可以存储8 TB使用CHAR数据库字符分析字符数据。BLOB数据类型用于存储非结构化的二进制大对象,例如与图像和视频数据关联的二进制大对象,其中数据只是“位”值的流。BLOB数据类型最多可以存储八兆字节的二进制数据。NCLOB数据类型可以将字符大对象存储在8字节至128 TB的多字节国家字符集中。BFILE数据类型值用作文件定位符或指向服务器文件系统上文件的指针。支持的最大文件大小为8TB至128TB。

约束条件

约束是在Oracle表中定义以确保数据完整性的一组规则。这些规则被强制放置在每列或每组列中。每当表参与数据操作时,这些规则就会被验证并在违反时引发异常。可用的约束类型为NOT NULL,主键,唯一,检查和外键。

可以使用以下语法在列级别施加约束。

句法:

column [data type] [CONSTRAINT constraint_name] constraint_type

除NOT NULL之外的所有约束也可以在表级别定义。复合约束只能在表级别指定。

非空约束

NOT NULL约束意味着数据行必须具有指定为NOT NULL的列的值。如果将列指定为NOT NULL,则Oracle RDBMS将不允许将行存储到违反此约束的雇员表中。只能在列级别定义,而不能在表级别定义。

句法:

COLUMN [data type] [NOT NULL]

唯一约束

有时有必要对不是主键列的列值强制执行唯一性.UNIQUE约束可用于强制执行此规则,Oracle将拒绝违反唯一约束的任何行。唯一约束可确保列值是不同的,没有任何重复。

句法:

列级:

COLUMN [data type] [CONSTRAINT ] [UNIQUE]

表级别: CONSTRAINT [约束名称] UNIQUE(列名称)

注意:Oracle在内部创建唯一索引以防止列值重复。索引将在后面的PL / SQL中讨论。

CREATE TABLE TEST
( ... ,
  NAME VARCHAR2(20) 
          CONSTRAINT TEST_NAME_UK UNIQUE,
  ... );

如果是复合唯一键,则必须在下表中定义它,如下所示。

CREATE TABLE TEST
( ... ,
  NAME VARCHAR2(20),
  STD VARCHAR2(20) ,
      CONSTRAINT TEST_NAME_UK UNIQUE (NAME, STD)
 );

首要的关键

每个表通常必须包含一列或一组列,以唯一地标识存储在表中的数据行。此列或一组列称为主键,大多数表只有一个列作为主键。键列限制为NULL和重复值。

注意事项-

  • 一个表只能有一个主键。

  • 可以在复合主键下合并多个列。

  • Oracle在内部创建唯一索引以防止列值重复。索引将在后面的PL / SQL中讨论。

句法:

列级别:

COLUMN [data type] [CONSTRAINT  PRIMARY KEY]

表级别:

CONSTRAINT [constraint name] PRIMARY KEY [column (s)]

以下示例显示如何在列级别使用PRIMARY KEY约束。

CREATE TABLE TEST
( ID  NUMBER CONSTRAINT TEST_PK PRIMARY KEY,
  ...  );
  

以下示例显示如何在表级别使用PRIMARY KEY约束定义组合主键。

CREATE TABLE TEST
 ( ...,
   CONSTRAINT TEST_PK PRIMARY KEY (ID) 
 );
 

外键

当两个表基于特定列共享父子关系时,子表中的联接列称为外键。父表中对应列的此属性称为引用完整性。子表中的外键列值可以可以为null或必须是父表的现有值。请注意,只有被引用表的主键列才有资格实施引用完整性。

如果在子表的列上定义了外键,则Oracle不允许删除父行(如果它包含任何子行)。但是,如果在定义外键时给出了ON DELETE CASCADE选项,则Oracle删除同样,ON DELETE SET NULL表示删除父表中的行时,外键值设置为null。

句法:

列级:

COLUMN [data type] [CONSTRAINT] [constraint name] [REFERENCES] [table name (column name)]

表级别:

CONSTRAINT [constraint name] [FOREIGN KEY (foreign key column name) REFERENCES] [referenced table name (referenced column name)]

下面的示例显示如何在列级别使用FOREIGN KEY约束。

CREATE TABLE TEST
(ccode varchar2(5) 
     CONSTRAINT TEST_FK REFERENCES PARENT_TEST(ccode),
   ...
);

ON DELETE CASCADE子句的用法

CREATE TABLE TEST
(ccode varchar2(5) 
   CONSTRAINT TEST_FK REFERENCES PARENT_TEST (ccode)
   ON DELETE CASCADE,
   ...
);

检查约束

有时存储在特定列中的数据值必须在可接受的值范围内.CHECK约束要求表中存储的每一行的指定检查条件为true或为未知.Check约束允许在条件列上施加条件规则列,在将数据插入到列之前必须先进行验证。条件不得包含子查询或伪列CURRVAL NEXTVAL,LEVEL,ROWNUM或SYSDATE。

Oracle允许单个列具有多个CHECK约束。实际上,可以为列定义的CHECK约束的数量没有实际限制。

句法:

列级别:

COLUMN [data type] CONSTRAINT [name] [CHECK (condition)]

表级别:

CONSTRAINT [name] CHECK (condition)

以下示例显示如何在列级别使用CHECK约束。

CREATE TABLE TEST
( ...,
   GRADE char (1) CONSTRAINT TEST_CHK
   CHECK (upper (GRADE) in ('A','B','C')),
   ...
);

以下示例显示如何在表级别使用CHECK约束。

CREATE TABLE TEST
( ...,
   CONSTRAINT TEST_CHK
   CHECK (stdate < = enddate),
);

ALTER TABLE语句

在数据库中创建表后,DBA可以更改表结构或列定义.DDL命令ALTER TABLE用于执行此类操作.Alter命令提供了模式对象专有的多个实用程序.ALTER TABLE语句用于添加,删除,重命名和修改表中的列。

下面的ALTER TABLE语句将表EMP重命名为EMP_NEW。

ALTER TABLE EMP RENAME TO EMP_NEW;

下面的ALTER TABLE语句将新列TESTCOL添加到EMP_NEW表中

ALTER TABLE EMP_NEW ADD (TESTCOL VARCHAR2 (100))

下面的ALTER TABLE语句将TESTCOL列重命名为TESTNEW。

ALTER TABLE EMP_NEW RENAME COLUMN TESTCOL TO TESTNEW

下面的ALTER TABLE语句从EMP_NEW表中删除TESTNEW列

ALTER TABLE EMP_NEW DROP COLUMN TESTNEW;

下面的ALTER TABLE语句在EMPLOYEE_ID列上添加主键。

ALTER TABLE EMP_NEW ADD PRIMARY KEY (EMPLOYEE_ID)

下面的ALTER TABLE语句删除主键。

ALTER TABLE EMP_NEW DROP PRIMARY KEY;

下面的ALTER TABLE语句将表模式切换为只读。

ALTER TABLE EMP_NEW READ ONLY;

只读表

只读表是Oracle 11g的一项增强功能,它允许将这些表用于只读目的。在早期的oracle版本中,通过将SELECT特权授予其他用户来使表成为只读状态,但所有者仍然具有读写权限。但是现在,如果将表设置为只读状态,即使所有者也无法访问数据。 。

句法:

ALTER TALE [TABLE NAME] READ ONLY
ALTER TALE [TABLE NAME] READ WRITE

插图

SQL>CREATE TABLE ORATEST (id NUMBER)

SQL>INSERT INTO ORATEST VALUES (1);

SQL>ALTER TABLE ORATEST READ ONLY;

SQL> INSERT INTO ORATEST VALUES (2);
INSERT INTO ORATEST VALUES (2)
            *
ERROR at line 1:
ORA-12081: update operation not allowed on table "TEST"."ORATEST"

SQL> UPDATE ORATEST SET id = 2;
UPDATE ORATEST SET id = 2
       *
ERROR at line 1:
ORA-12081: update operation not allowed on table "TEST"."ORATEST"

SQL> DELETE FROM ORATEST;
DELETE FROM ORATEST
            *
ERROR at line 1:
ORA-12081: update operation not allowed on table "TEST"."ORATEST"

SQL> TRUNCATE TABLE ORATEST;
TRUNCATE TABLE ORATEST
               *
ERROR at line 1:
ORA-12081: update operation not allowed on table "TEST"."ORATEST"

SQL> ALTER TABLE ORATEST ADD (description VARCHAR2 (50));
ALTER TABLE ORATEST ADD (description VARCHAR2 (50))
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "TEST"."ORATEST"

SQL> ALTER TABLE ORATEST READ WRITE;

Table altered.

SQL> DELETE FROM ORATEST;

1 row deleted.

DROP TABLE语句

DROP TABLE语句用于从数据库中删除表。删除的表及其数据将不再可供选择。如果在recyclebin中可用,则可以使用FLASHBACK实用程序恢复删除的表。删除表将删除索引并触发与之关联的触发器。

句法:

DROP TABLE [TABLE NAME] [PURGE]

下面的语句将删除该表并将其放入回收站。

DROP TABLE emp_new;

下面的语句将删除该表,并将其也从回收站中清除。

DROP TABLE emp_new PURGE;