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之前一定要再三检查,最好备份过后再操作。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

