DDL语句,数据定义语句

创建表:CREATE TABLE

​ CREATE TABLE的基本语法如下。

CREATE TABLE schema_name.table_name (
    column_1 data_type column_constraint,
    column_2 data_type column_constraint,
    ...
    table_constraint
 );

​ 示例

CREATE TABLE ot.persons(
    person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50) NOT NULL,
    PRIMARY KEY(person_id)
);

​ 上面的语句就创建了如下表

  • 列名 person_id first_name last_name
    类型 NUMBER(自增,主键) VARCHAR VARCHAR

CREATE TABEL AS

​ CREATE TABLE AS语句可以从现有的表格中复制列和对应的数据来创建新的表。

  • 基本语法

    CREATE TABLE new_table  
    AS (SELECT * FROM old_table);
    • 其中的SELECT子句可使用复杂的查询,如多表查询。
    • SELECT子句中所查询到的数据也会被复制到新表中的记录。

删除表:DROP TABLE

DROP TABLE persons
  • 若要删除的表中主键被其他表的外键锁引用,则删除失败。此时应该使用

    DROP TABLE persons CASCADE CONSTRAINTS;

    此时在删除persons表的同时,还将删除其他表中关联了persons表的外键约束。

  • drop后的表会被放在回收站里,要彻底删除应该加上PURGE

    DROP TABLE persons PURGE

ALTER TABLE

添加新的列到表中:ALTER TABLE ADD

//语法
ALTER TABLE table_name
ADD column_name type constraint;
//添加多列
ALTER TABLE table_name
ADD (
    column_name type constraint,
    column_name type constraint,
    ...
);

//例子
ALTER TABLE persons 
ADD birthdate DATE NOT NULL;
  • 新添加的列只会被添加在表的末尾。

  • 如果表中已存在同名列则会提示错误。

    • 要检查表中是否存在列,可以从user_tab_cols视图查询数据:

      SELECT
          COUNT(*)
      FROM
          user_tab_cols
      WHERE
          column_name = ''
          AND table_name = '';

修改列属性:ALTER TABLE MODIFY

//语法
ALTER TABLE table_name MODIFY column_name type constraint;
//多列
ALTER TABLE table_name
 MODIFY ( column_1 type constraint,
          column_1 type constraint,
         ...);

//例子
ALTER TABLE persons MODIFY birthdate DATE NULL;
  • 在oracle 12c中,可将列定义为可见或者不可见。不可见不能用于查询。

    ALTER TABLE table_name MODIFY col_name [VISIBLE/INVISIBLE]
    • INVISIBLE和UNUSED的区别在于:INVISIBLE只能限制查询语句,一个列被设为invisible过后仍然可以在插入(修改)语句中使用。而被设为unused的列若在插入(修改)语句中被使用就会报错。**所以说这里的不可见是指查询不可见。**

删除列:ALTER TABLE DROP

ALTER TABLE table_name
DROP COLUMN column_name;

ALTER TABLE persons
DROP
  COLUMN birthdate;
  • 在大表中删除列可能耗费大量的时间和资源。通常先使用SET UNUSED 语句来逻辑删除列(可理解为隐藏),然后在非高峰期用DROP UNUSED COLUMNS物理上删除所以被隐藏的列。

    ALTER TABLE table_name 
    SET UNUSED COLUMN column_name;
    
    ALTER TABLE table_name
    DROP UNUSED COLUMNS;
  • 在DBA_UNUSED_COL_TABS视图中可以查看每张表被UNUSED方法删除的列数。

    SELECT * FROM DBA_UNUSED_COL_TABS

重命名列或表:ALTER TABLE RENAME

//重命名列名
ALTER TABLE table_name
RENAME COLUMN column_name TO new_name;

//重命名表名
ALTER TABLE table_name
RENAME TO new_table_name;
  • 当重命名表时,Oracle自动将旧表上的索引,约束和授权转移到新表上。 另外,它使依赖重命名表(原表)的所有对象失效,如视图,存储过程,函数和同义词。

截断表

​ 对于有少量行记录的表,DELETE语句做得很好。 但是,当拥有大量行记录的表时,使用DELETE语句删除所有数据效率并不高。

​ 这时,可以使用TRUNCATE TABLE删除表中的所有数据并*保留表结构(Drop会直接删除整张表,包括表结构)*

TRUNCATE TABLE table_name;

*注意:TRUNCATE在功能上看上去和DELETE一样,但它却需要DROP权限,这意味着:

  • TRUNCATE是DDL语句,无法回滚!
  • TRUNCATE不会激活与表有关的删除触发器。
  • TRUNCATE会重置表的自增值。

所以在TRUNCATE之前一定要再三检查,最好备份过后再操作。


数据库相关      sql Oracle

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

 目录