
# DDL
#### 简介
数据库的 DDL 功能用于数据库对象的变更。GaussDB支持如下DDL功能：
- 索引操作
- 主键操作
- 列操作
- 生成列操作
- 外键操作
- 表操作
- 分区操作
- 模式操作
- 数据库实例操作
- 表空间操作
 
按照是否涉及 DDL 目标对象数据的处理，DDL 语句可以划分为两种类型：
- 逻辑 DDL 语句：仅修改数据库对象的元数据，不处理对象存储的数据，例如变更表名或变更列名。
- 物理 DDL 语句：同时修改变更对象的元数据和对象所存储的用户数据。例如，为表创建索引，需要修改表定义并进行全表扫描以构建新索引。
 
#### 原理
- 逻辑DDL语句：因仅需要修改数据库对象的元数据，因此执行时间通常较短，只需要几十毫秒或者几秒。执行这类 DDL 语句几乎不消耗系统资源，因此不会影响业务负载。
- 物理DDL语句：执行时间较长，且执行时间与表的数据量、机器配置以及业务负载有关。离线DDL执行期间加排他锁，数据重组与元数据修改完后提交后释放锁，因此执行期间会阻塞业务执行。物理DDL会长时间阻塞业务，因此GaussDB提供在线DDL在对业务影响较小的情况下进行DDL，减少对业务的影响，提高业务运行的连续性和数据库的可用性。在线DDL不会长时间加排他锁，执行中允许对该表的并发读写操作，减少对用户业务运行影响。
 
#### 示例
本小节介绍GaussDBDDL基本功能，因DDL功能比较多，仅介绍部分常用操作，如列操作和表操作等。
1. 创建表。 
   ```
   gaussdb=# CREATE TABLE t1(c1 INT,c2 INT);
   CREATE TABLE
   gaussdb=# INSERT INTO t1 VALUES(generate_series(1,10), generate_series(1,10));
   INSERT 0 10
   ```
   
   
2. 增加列。 
   ```
   gaussdb=# ALTER TABLE t1 ADD COLUMN c3 INTEGER;
   ALTER TABLE
   ```
   
   
3. 删除列。 
   ```
   gaussdb=# ALTER TABLE t1 DROP COLUMN c3;
   ALTER TABLE
   ```
   
   
4. 重命名表。 
   ```
   gaussdb=# ALTER TABLE t1 RENAME TO t2;
   ALTER TABLE
   gaussdb=# ALTER TABLE t2 RENAME TO t1;
   ALTER TABLE
   ```
   
   
5. 修改列类型。 
   - 在线修改列类型。
     ```
     gaussdb=# ALTER TABLE ONLINE t1 ALTER c2 TYPE BIGINT;
     ALTER TABLE
     ```
     
   
   - 离线修改列类型。
     ```
     gaussdb=# ALTER TABLE t1 ALTER c2 TYPE INT;
     ALTER TABLE
     ```
     
   
   
   
   
 
#### 另请阅读
- 离线DDL另请阅读《参考》中"SQL参考 \> SQL语法 \> DDL语法一览表"章节。
- 在线DDL另请阅读[在线DDL](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0764.html)、《参考》中"SQL参考 \> SQL语法 \> Online DDL及其操作"章节。
 
