DATABASE
CREATE DATABASE
CREATE DATABASE [IF NOT EXISTS] database_name
CREATE DATABASE 是以给定的名称创建一个数据库。用户需要获得创建数据库的权限,才可以使用 CREATE DATABASE。
示例 1:创建数据库。
gbase> CREATE DATABASE test1;
Query OK, 1 row affected
DROP DATABASE
DROP DATABASE [IF EXISTS] database_name
DROP DATABASE 删除指定的数据库以及它所包含的表。请小心使用此语句!用户需要获得对数据库的 DROP 权限,才可以使用 DROP DATABASE。
使用关键字 IF EXISTS,以防止由于数据库不存在而报告错误。
示例 1:删除数据库。
gbase> DROP DATABASE IF EXISTS test;
Query OK, 1 row affected
TABLE
在本节中用到的术语如下。
复制表:创建表使用 REPLICATED 关键字,这样创建的表为复制表。复制表将会存储于 GBase 8a MPP Cluster 的各个数据节点上,每个数据节点都会保存完整数据。
随机分布表:不需要使用关键字。数据以随机分配方式,均匀存储到集群各个数据节点。
哈希分布表:创建表时使用 DISTRIBUTED BY column_name 指定创建表中的物理列 column_name 是哈希列,这样创建的表为哈希分布表。数据按照指定的 Hash 字段进行哈希分布。
临时表:创建表时使用 TEMPORARY 关键字,这样创建的表为临时表,临时表仅存在于当前 session 中。
预租磁盘:预租磁盘空间可以预先批量分配磁盘块,这样尽量保证了列的 DC 数据文件磁盘块连续。在顺序读取列 DC 数据时,性能会有明显提升。
表类型: GBase 8a MPP Cluster 数据库主要有以下 4 种表类型。
复制表
随机分布表
哈希分布表
临时表
CREATE TABLE
CREATE TABLE 以用户给定的名字在当前数据库创建一个表。用户必须有创建表的权限。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]
[database_name.]table_name
(column_definition [,column_definition], ... [, key_options])
[table_options]
column_definition:
column_name data_type [NOT NULL | NULL] [DEFAULT default_value]
[COMMENT comment_value]
key_options:
KEY key_name ('column_name') [key_dc_size = dc_value USING HASH
GLOBAL]
table_options:
[REPLICATED | DISTRIBUTED BY ('column_name') ]
[COMMENT 'comment_value']参数说明如下:
TEMPORARY:该参数为可选参数,创建临时表需要使用此关键字。临时表的创建请参见‚4.1.2.1.3 CREATE TEMPORARY TABLE‛的内容。
IF NOT EXISTS:该参数为可选参数,用户可以使用关键字 IF NOT EXISTS创建表,如果表已经存在,系统将报告 WARNING 信息。
database_name:该参数为可选参数,指定数据库后,在此数据库下创建表。如果没有显示指定 database_name 参数,创建的表隶属于 USE database_name 后的数据库中的表。
table_name:表命名规则请参见‚2.2 数据库、表、列和别名‛。默认情况下,在当前数据库中创建表。如果没有指定当前数据库或表已经存在,则报告错误信息。
column_name:指定表中的数据列。
data_type:指定数据列的数据类型。数据类型参见‚1 数据类型‛中的内容。
NOT NULL | NULL:指定数据列的值,是否允许为 NULL。如果既没有指定 NULL 也没有指定 NOT NULL,列被视为指定了可以为 NULL。
default_value:指定数据列的默认值。默认值必须是一个常数,而不能是一个函数或者一个表达式。举例来说,用户不能将一个数据列的默认值设置为 NOW()或者 CURRENT_DATE()之类的函数。对于给定的一个表,可以使用SHOW CREATE TABLE 语句来查看哪些列有显式 DEFAULT 子句。
comment_value:指定数据列的备注说明。例如: stu_no id COMMENT '学号'。
key_options:指定表中的 hash 列。同时可以使用 key_dc_size 参数指定创建分段 Hash INDEX。
dc_value 值如下表所示:
最小值 | 最大值 | 备注 |
0 | 2147483646 | 默认为0(即在整列上创建HASH) |
table_options:默认为随机分布表。
REPLICATED:指定是否是复制表。
在创建一个表时,用户可以使用关键词 REPLICATED 来指定是否创建复制表。如果指定了关键词 REPLICATED,那么创建的复制表在 GBase 8a MPP Cluster 的各个节点上存放的是完整数据。
注意: 复制表表名尾部不允许是_n{number}编号,例如, mytable_n1,mytable_n12 是不允许使用的。
DISTRIBUTED BY column_name:指定创建表中的物理列 column_name 是哈希列,这样创建的表,称为哈希分布表。哈希列的值可以为空,但必须是INT 或者 VARCHAR 类型或DECIMAL 类型(执行 OGG Kafka 数据同步时,哈希列的值同样不能为空) 。
key_dc_size = dc_value USING HASH GLOBAL:配合 DISTRIBUTED BY使用,指定分段 HASH 列,同时创建多个分段 HASH 列。
COMMENT:指定表的备注说明。可以用 SHOW CREATE TABLE table_name和 SHOW FULL COLUMNS FROM table_name 语句来显示备注信息。
示例 1: 创建一张随机分布表。
gbase> CREATE TABLE t1(a int, b int) ;
Query OK, 1 row affected
示例 2: 创建一张复制表。
gbase> CREATE TABLE t2(a int, b int) REPLICATED;
Query OK, 1 row affected
gbase> SHOW CREATE TABLE t2;
+-------+-----------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------+
| t2 | CREATE TABLE "t2" (
"a" int(11) DEFAULT NULL,
"b" int(11) DEFAULT NULL
) ENGINE=EXPRESS REPLICATED DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace'|
+-------+-----------------------------------------------------------------+
1 row in set
gbase> DESC t2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a | int(11) | YES | | NULL | |
| b | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set
示例 3:创建带有列注释信息的表。
gbase> CREATE TABLE t1 (f_username varchar(10) comment 'name' ) ;
Query OK, 0 rows affected
gbase> DESC t1;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| f_username | varchar(10) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
1 row in set
gbase> SHOW CREATE TABLE t1;
+-------+--------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------+
| t1 | CREATE TABLE "t1" (
"f_username" varchar(10) DEFAULT NULL COMMENT 'name'
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace'|
+-------+--------------------------------------------------------+
1 row in set
CREATE TABLE...AS SELECT...
语法格式:
CREATE TABLE table_name [(column_definition,...)] [REPLICATED] [DISTRIBUTED BY] [AS] SELECT ...
功能:
根据列定义以及投影列创建表结构,并且将 SELECT 中查询的数据复制到所创建的表中。
参数说明如下:
REPLICATED:指定创建复制表选项。
DISTRIBUTED BY:指定创建表中的物理列 column_name 是哈希列。
AS:指定 SELECT 语句,可选关键字。
其他参数说明请参见‚4.1.2.1 CREATE TABLE‛参数说明部分的内容。
示例 1:复制全表表结构及数据来创建随机分布表。
gbase> CREATE TABLE t7(a INT, b DECIMAL, c FLOAT, d DATETIME);
Query OK, 0 rows affected
gbase> INSERT INTO t7 VALUES(1,2,3.345,'2011-11-11
11:11:11'),(3,5,5.678,'2011-11-11 22:22:22');
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
gbase> CREATE TABLE t8 SELECT * FROM t7;
Query OK, 2 rows affected
gbase> SELECT * FROM t8;
+------+------+-------+---------------------+
| a | b | c | d |
+------+------+-------+---------------------+
| 1 | 2 | 3.345 | 2011-11-11 11:11:11 |
| 3 | 5 | 5.678 | 2011-11-11 22:22:22 |
+------+------+-------+---------------------+
2 rows in set
示例 2:按照联合查询 SELECT 的数据列复制表结构,创建新的随机分布表,新表中包含联合查询后的数据。
gbase> CREATE TABLE t11 SELECT a,b FROM t7 WHERE d>'2011-11-11 11:11:11' UNION
ALL SELECT a,b FROM t7 WHERE d='2011-11-11 11:11:11';
Query OK, 2 rows affected
gbase> SELECT * FROM t11;
+------+------+
| a | b |
+------+------+
| 3 | 5 |
| 1 | 2 |
+------+------+
2 rows in set
注: create table ...as 后面接集合类算子时,支持括号。 create table ...as 后面接集合类算子时加不加括号是等价的, 并且 select ...union all select ... 外面的括号只能括一次
CREATE TABLE...LIKE...
语法格式:
CREATE TABLE table_name1 LIKE table_name2;
功能:
复制 table_name2 的表结构来创建表 table_name1。
注:不支持源为 dblink 表,例如:
create table test1 like test1@oracle_link1; -- 不支持
示例 1:随机分布表
gbase> CREATE TABLE t5(a int,b datetime);
Query OK, 0 rows affected
gbase> INSERT INTO t5 VALUES(1,NOW());
Query OK, 1 row affected
gbase> CREATE TABLE t6 LIKE t5;
Query OK, 0 rows affected
gbase> SHOW CREATE TABLE t6;
+-------+---------------------------------------------------------+
| Table | Create Table
+-------+---------------------------------------------------------+
| t6 | CREATE TABLE "t6" (
"a" int(11) DEFAULT NULL,
"b" datetime DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+---------------------------------------------------------+
1 row in set
gbase> SELECT * FROM t6;
Empty set
示例 2:复制表
gbase> CREATE TABLE t5(a int,b datetime) REPLICATED;
Query OK, 0 rows affected
gbase> INSERT INTO t5 VALUES(1,NOW());
Query OK, 1 row affected
gbase> DROP TABLE t6;
Query OK, 0 rows affected
gbase> CREATE TABLE t6 LIKE t5;
Query OK, 0 rows affected
gbase> SHOW CREATE TABLE t6;
+-------+-----------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------+
| t6 | CREATE TABLE "t6" (
"a" int(11) DEFAULT NULL,
"b" datetime DEFAULT NULL
) ENGINE=EXPRESS REPLICATED DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace'|
+-------+-----------------------------------------------------------------+
1 row in set
CREATE TEMPORARY TABLE...
功能:
在创建一个表时,用户可以使用关键词 TEMPORARY。临时表被限制在当前连接中,当连接关闭时,临时表会自动地删除。这就意味着,两个不同的连接可以使用同一个临时表名而不会发生冲突,也不会与同名现有的表冲突(现有表将被隐藏,直到临时表被删除)。使用此种方法,一旦客户端与 GBase8a MPP Cluster 断开连接,临时表将自动删除。
注意事项:
临时表支持除 ALTER 之外的所有 DDL 及 DML 操作。
临时表不能被备份。
临时表不支持使用 gcdump 工具导出表结构。
临时表支持在当前连接中使用查询结果导出语句导出表中数据。
在进行集群数据重分布、备份恢复前需要清除当前连接中的临时表。
示例 1:创建临时表。
gbase> USE test;
Query OK, 0 rows affected
gbase> CREATE TEMPORARY TABLE tem_table (a int);
Query OK, 0 rows affected
gbase> INSERT INTO tem_table VALUES(1),(2),(7),(9);
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0
gbase> SELECT * FROM tem_table;
+------+
| a |
+------+
| 1 |
| 2 |
| 7 |
| 9 |
+------+
4 rows in set
gbase> EXIT
Bye
$ gccli -uroot --nice_time_format -p
Enter password
GBase client 8.6.2.43-R5.108871. Copyright (c) 2004-2013, GBase. All Rights
Reserved.
gbase> USE test;
Query OK, 0 rows affected
gbase> SELECT * FROM tem_table;
ERROR 1146 (42S02): Table 'test.tem_table' doesn't exist
示例 2:创建的临时表与复制表同名。
gbase> CREATE TABLE t1 (a int,b varchar(10)) REPLICATED;
Query OK, 0 rows affected
gbase> CREATE TEMPORARY TABLE t1 (a int,b varchar(10));
Query OK, 0 rows affected
示例 3:创建临时表,使用 DISTRIBUTED BY 关键字。
gbase> CREATE TEMPORARY TABLE t1 (a int,b varchar(10)) DISTRIBUTED BY ('a');
Query OK, 0 rows affected
gbase> SHOW CREATE TABLE t1;
+-------+--------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------+
| t1 | CREATE TEMPORARY TABLE "t1" (
"a" int(11) DEFAULT NULL,
"b" varchar(10) DEFAULT NULL
)ENGINE=EXPRESS DISTRIBUTED BY('a') DEFAULT CHARSET=utf8
TABLESPACE='sys_tablespace' |
+-------+--------------------------------------------------+
示例 5:创建临时表,使用 REPLICATED 关键字。
gbase> CREATE TEMPORARY TABLE t1 (a int,b varchar(10)) REPLICATED;
Query OK, 0 rows affected
gbase> SHOW CREATE TABLE t1;
+-------+-----------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------+
| t1 | CREATE TEMPORARY TABLE "t1" (
"a" int(11) DEFAULT NULL,
"b" varchar(10) DEFAULT NULL
) ENGINE=EXPRESS REPLICATED DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace'|
+-------+-----------------------------------------------------------------+
1 row in set
示例 6:复制全表表结构及数据来创建临时表( CREATE TEMPORARY
TABLE...AS SELECT...)
gbase> CREATE TABLE t7(a INT, b DECIMAL, c FLOAT, d DATETIME);
Query OK, 0 rows affected
gbase> INSERT INTO t7 VALUES(1,2,3.345,'2011-11-11
11:11:11'),(3,5,5.678,'2011-11-11 22:22:22');
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
gbase> CREATE TEMPORARY TABLE t8 AS SELECT * FROM t7;
Query OK, 2 rows affected
gbase> EXIT
Bye
$ gccli –uroot –p
Enter password:
GBase client 8.6.2.43-R5.108871. Copyright (c) 2004-2013, GBase. All Rights
Reserved.
gbase>
gbase> USE test;
Query OK, 0 rows affected
gbase> SHOW CREATE TABLE t8;
ERROR 1146 (42S02): Table 'test.t8' doesn't exist
gbase>
示例 7:复制 t7 的表结构来创建临时表 t8。(CREATE TEMPORARY
TABLE...LIKE...)
gbase> CREATE TEMPORARY TABLE t8 LIKE t7;
Query OK, 0 rows affected
gbase> SELECT * FROM t8;
Empty set
gbase> SHOW CREATE TABLE t8;
+-------+---------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------+
| t8 | CREATE TEMPORARY TABLE "t8" (
"a" int(11) DEFAULT NULL,
"b" decimal(10,0) DEFAULT NULL,
"c" float DEFAULT NULL,
"d" datetime DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+---------------------------------------------------------+
1 row in set
ALTER TABLE
ALTER TABLE [database_name.]table_name
alter_specification [, alter_specification] ...
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD INDEX [index_name] [index_type] (index_col_name,...)
| CHANGE [COLUMN] old_col_name new_col_name column_definition
| CHANGE [COLUMN] old_col_name new_col_name VARCHAR(length)
| MODIFY [COLUMN] col_name column_definition
FIRST | AFTER col_name
| MODIFY [COLUMN] col_name VARCHAR(length)
FIRST | AFTER col_name
| RENAME [TO] new_table_name
| DROP [COLUMN] col_name
| SHRINK SPACE
参数说明如下:
ADD [COLUMN] (column_definition,...):用于增加新的数据列,如果使用 FIRST,则新增加的列位于所有数据列的前面;如果使用 AFTER,则新增加的列,位于指定数据列的后面。默认不使用 FIRST、 AFTER,则将新增加的列追加到末尾处。
CHANGE [COLUMN] old_col_name new_col_name column_definition:修改列名称。不支持修改列定义。
CHANGE [COLUMN] old_col_name new_col_name VARCHAR(length):当字段为VARCHAR 类型时,使用 CHANGE 除修改列名称外还可以增加字段的长度。
具体使用方式及限制,参见‚4.1.2.2.2 ALTER TABLE…CHANGE|MODIFY…VARCHAR(LENGTH)‛章节。
MODIFY [COLUMN] col_name column_definition COMMENT comment_value
FIRST | AFTER col_name :修改表中存在列的位置和列注释。除 varchar
类型以外,其他类型的列定义不支持修改。
MODIFY col_name VARCHAR(length) FIRST | AFTER col_name :当字段为 varchar 类型时,使用 MODIFY 除修改列位置外还可以增加字段的长度。具体使用方式及限制,参见‚4.1.2.2. 2ALTER TABLE…CHANGE|MODIFY…VARCHAR(LENGTH)‛章节。
RENAME [TO] new_table_name:修改表名称为 new_table_name。
DROP [COLUMN] col_name:删除表中存在的列。
SHRINK SPACE:释放被删除或未提交的数据文件所占的磁盘空间。
补充说明:
修改列顺序时如果不填写原有的列注释信息,相当于将列注释修改为空。
示例 1:增加列,并指定增加列的位置。
gbase> CREATE TABLE t (f_1 int);
Query OK, 0 rows affected
gbase> DESC t;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| f_1 | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set
gbase> ALTER TABLE t ADD COLUMN name1 varchar(20) AFTER f_1;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| f_1 | int(11) | YES | | NULL | |
| name1 | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set
示例 2:增加列,不写 AFTER 和 FIRST,默认追加到末尾。
gbase> ALTER TABLE t ADD COLUMN name2 varchar(10);
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| f_1 | int(11) | YES | | NULL | |
| name1 | varchar(20) | YES | | NULL | |
| name2 | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
示例 3:一次性增加多列。
gbase> ALTER TABLE t ADD COLUMN (name3 varchar(30),address varchar(40));
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| f_1 | int(11) | YES | | NULL | |
| name1 | varchar(20) | YES | | NULL | |
| name2 | varchar(10) | YES | | NULL | |
| name3 | varchar(30) | YES | | NULL | |
| address | varchar(40) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set
示例 4:删除多列。
gbase> ALTER TABLE t DROP COLUMN name3,DROP COLUMN name2;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| f_1 | int(11) | YES | | NULL | |
| name1 | varchar(20) | YES | | NULL | |
| address | varchar(40) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set
示例 5:同时增加多列,删除一列。
gbase> ALTER TABLE t ADD COLUMN(phone varchar(20), sex int), DROP COLUMN f_1;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+---------+-------------+------+-----+---------+-------+
| Field | Type | | Null | Key | Default | Extra | |
+---------+-------------+------+-----+---------+-------+ | name1 | varchar(20) | YES | | NULL | | | address | varchar(40) | YES | | NULL | | | |
| phone | varchar(20) | YES | | NULL | | | |
| sex | int(11) | | YES | | NULL | | |
+---------+-------------+------+-----+---------+-------+
4 rows in set
示例 6:变更表名称。
gbase> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| products |
| t |
+----------------+
2 rows in set
gbase> ALTER TABLE t RENAME ttt2;
Query OK, 0 rows affected
gbase> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| products |
| ttt2 |
+----------------+
2 rows in set
示例 7:变更列名 b 为新列名 d。
gbase> CREATE TABLE t (a int DEFAULT 1,b varchar(10), c varchar(10));
Query OK, 0 rows affected
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | int(11) | | YES | | 1 | | |
| b | varchar(10) | YES | | NULL | | | |
| c | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
gbase> ALTER TABLE t CHANGE b d varchar(10);
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | int(11) | YES | | 1 | |
| d | varchar(10) | YES | | NULL | |
| c | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
示例 8:变更列的位置至最前。
gbase> CREATE TABLE t(a int ,b varchar(10),c bool);
Query OK, 0 rows affected
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | int(11) | YES | | NULL | |
| b | varchar(10) | YES | | NULL | |
| c | tinyint(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
gbase> ALTER TABLE t MODIFY b varchar(10) FIRST;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| b | varchar(10) | YES | | NULL | |
| a | int(11) | YES | | NULL | |
| c | tinyint(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
示例 9:变更某列的位置到指定列的后面。
gbase> ALTER TABLE t MODIFY b varchar(10) AFTER c;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | int(11) | YES | | NULL | |
| c | tinyint(1) | YES | | NULL | |
| b | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
ALTER TABLE... SHRINK SPACE
语法格式:
ALTER TABLE [database_names.]tbl_name SHRINK SPACE [FULL] | [FULL
BLOCK_REUSE_RATIO=num];
FULL:按行级回收,完全保证有效行原始顺序,效率比较低;
BLOCK_REUSE_RATIO:每个 block(DC)重用率(0~100],指 DC 的有效数据占比 >= 该值时则重用该 DC;无法保证原始顺序;
注: 包含行存列的表不支持shrink space深度回收。
功能:
释放被删除的数据文件所占的磁盘空间。
能够对被删除数据(一定范围内连续数据)所占用的磁盘空间进行回收,
包括:数据文件、 hash index(分段 hash)、智能索引( BSI/ASI)、 delete
bitmap、全文索引等,占磁盘空间较多的文件全部支持空间回收。回收 insert select 或 load 未提交产生的垃圾文件。
注意事项:
磁盘空间回收命令仅针对表。
数据文件所占的磁盘空间回收以文件为单位,只有当这个数据文件涉及的数据都被删除后才能回收该文件占用的磁盘空间。
如果被删除的数据只命中 DC 的部分数据,则该数据文件不能被清理。
如果删除数据命中所有数据,则有尾块数据的文件不被清理。
磁盘空间回收过程中需要一定的磁盘空间来备份部分元数据文件,在没有可用空间的情况下执行该命令会报错,这时需要手工清理一部分空间(一般需要 1G 空间)再执行该命令进行空间回收。
示例 1:释放被删除的数据文件占有的磁盘空间。
示例中用到的表及数据如下:
DROP TABLE IF EXISTS lineitem;
CREATE TABLE lineitem (
l_orderkey bigint,
l_partkey bigint,
l_suppkey bigint,
l_linenumber bigint,
l_quantity decimal(15,2),
l_extendedprice decimal(15,2),
l_discount decimal(15,2),
l_tax decimal(15,2),
l_returnflag char(1),
l_linestatus char(1),
l_shipdate date,
l_commitdate date,
l_receiptdate date,
l_shipinstruct char(25),
l_shipmode char(10),
l_comment varchar(50)
)DISTRIBUTED BY ('l_orderkey');
通过本地加载方式, 加载数据到 lineitem 表中:
gbase> load data infile 'file://192.168.1.1/opt/loadfile/lineitem.tbl'
INTO TABLE ssbm.lineitem FIELDS TERMINATED BY '|';
查看 node1 数据文件:
# ll /opt/gnode/userdata/gbase/test/sys_tablespace/lineitem_n1
总用量 15625296
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00000.seg.1
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00001.seg.1
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00002.seg.1
-rw-rw---- 1 gbase gbase 135057661 11月 25 17:57 C00003.seg.1
-rw-rw---- 1 gbase gbase 270072041 11月 25 17:57 C00004.seg.1
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00005.seg.1
-rw-rw---- 1 gbase gbase 135057661 11月 25 17:57 C00006.seg.1
-rw-rw---- 1 gbase gbase 135057661 11月 25 17:57 C00007.seg.1
-rw-rw---- 1 gbase gbase 405160617 11月 25 17:57 C00008.seg.1
-rw-rw---- 1 gbase gbase 405160617 11月 25 17:57 C00009.seg.1
-rw-rw---- 1 gbase gbase 1080158321 11月 25 17:57 C00010.seg.1
-rw-rw---- 1 gbase gbase 1080158321 11月 25 17:57 C00011.seg.1
-rw-rw---- 1 gbase gbase 1080158321 11月 25 17:57 C00012.seg.1
-rw-rw---- 1 gbase gbase 1990720125 11月 25 17:16 C00013.seg.1
-rw-rw---- 1 gbase gbase 1654785612 11月 25 17:57 C00013.seg.3
-rw-rw---- 1 gbase gbase 1620290037 11月 25 17:57 C00014.seg.1
-rw-rw---- 1 gbase gbase 1981676173 11月 25 17:14 C00015.seg.1
-rw-rw---- 1 gbase gbase 1866271509 11月 25 17:57 C00015.seg.3
gbase> SELECT COUNT(*) FROM lineitem;
+-----------+
| COUNT(*) |
+-----------+
| 600037902 |
+-----------+
1 row in set
gbase> SELECT MIN(rowid),MAX(rowid) FROM lineitem;
+------------+------------+
| min(rowid) | max(rowid) |
+------------+------------+
| 0 | 135037279 |
+------------+------------+
1 row in set
删除数据后释放磁盘空间:
gbase> DELETE FROM lineitem WHERE rowid <130000000;
Query OK, 580028668 rows affected
gbase> SELECT COUNT(*) FROM lineitem;
+----------+
| count(*) |
+----------+
| 20009234 |
+----------+
1 row in set
gbase> ALTER TABLE lineitem SHRINK SPACE;
Query OK, 0 rows affected
查看 node1 数据文件:
# ll /opt/gnode/userdata/gbase/test/sys_tablespace/lineitem_n1
总用量 11745992
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00000.seg.1
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00001.seg.1
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00002.seg.1
-rw-rw---- 1 gbase gbase 135057661 11月 25 17:57 C00003.seg.1
-rw-rw---- 1 gbase gbase 270072041 11月 25 17:57 C00004.seg.1
-rw-rw---- 1 gbase gbase 540100801 11月 25 17:57 C00005.seg.1
-rw-rw---- 1 gbase gbase 135057661 11月 25 17:57 C00006.seg.1
-rw-rw---- 1 gbase gbase 135057661 11月 25 17:57 C00007.seg.1
-rw-rw---- 1 gbase gbase 405160617 11月 25 17:57 C00008.seg.1
-rw-rw---- 1 gbase gbase 405160617 11月 25 17:57 C00009.seg.1
-rw-rw---- 1 gbase gbase 1080158321 11月 25 17:57 C00010.seg.1
-rw-rw---- 1 gbase gbase 1080158321 11月 25 17:57 C00011.seg.1
-rw-rw---- 1 gbase gbase 1080158321 11月 25 17:57 C00012.seg.1
-rw-rw---- 1 gbase gbase 1654785612 11月 25 17:57 C00013.seg.3
-rw-rw---- 1 gbase gbase 1620290037 11月 25 17:57 C00014.seg.1
-rw-rw---- 1 gbase gbase 1866271509 11月 25 17:57 C00015.seg.3
ALTER TABLE…CHANGE|MODIFY…VARCHAR(LENGTH)
语法格式:
ALTER TABLE [database_names.]tbl_name CHANGE old_col_name new_col_name VARCHAR(length);
或
ALTER TABLE [database_names.]tbl_name MODIFY col_name VARCHAR(length) [FIRST | AFTER col_name ];
功能:
使用 alter table 的 change 参数和 modify 参数,既可以修改列名称、列位置,还可以增加表中 varchar 字段的长度。
注意事项:
修改 varchar 字段的长度,要保证不短于已有的长度,以保证原有数据不出错,因此在 GBase8a MPP Cluster 中,只能增加 varchar 字段的长度,不能减小 varchar 字段的长度。
字符集为 utf8 时,修改后的长度要大于等于表定义时的该字段 varchar的长度,小于等于 10922。具体的最大值还要受限于表的宽度来确定,所有列长度之和不能超过表的宽度,表的记录的最大长度为 512k。
如果创建表时定义了 hash index,则不能使用本命令增加字段长度。
示例 1:修改 varchar 类型的列名称,并增加该列的长度。
gbase> DROP TABLE IF EXISTS t;
Query OK, 0 rows affected, 4 warnings
gbase> CREATE TABLE t(a varchar(10));
Query OK, 0 rows affected
gbase> ALTER TABLE t CHANGE a b varchar(20);
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| b | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
1 row in set
示例 2:修改表中 varchar 类型的列位置至最前,并增加该列的长度。
gbase> DROP TABLE IF EXISTS t;
Query OK, 0 rows affected
gbase> CREATE TABLE t(a int,b varchar(10),c bool);
Query OK, 0 rows affected
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | int(11) | YES | | NULL | |
| b | varchar(10) | YES | | NULL | |
| c | tinyint(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
gbase> ALTER TABLE t MODIFY b varchar(20) FIRST;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| b | varchar(20) | YES | | NULL | |
| a | int(11) | YES | | NULL | |
| c | tinyint(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
示例 3:修改表中 varchar 类型的列位置到指定列的后面,并增加该列的长度。
gbase> ALTER TABLE t MODIFY b varchar(30) AFTER c;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
gbase> DESC t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | int(11) | YES | | NULL | |
| c | tinyint(1) | YES | | NULL | |
| b | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set
RENAME TABLE
语法格式:
RENAME TABLE [database_name.]old_table_name TO [database_name.]new_table_name;
参数说明如下:
database_name:是要修改表隶属的数据库名称,可选项;省略此参数,即为 USE 后的数据库名称。
old_table_name:是表的原有名称。
new_table_name:是表修改后的新名称。
功能:
RENAME TABLE 的功能就是将一张已经存在的表的名称修改为一个不存在的新的表名称。
示例 1:更改表 tx1 的名称为 tx_1。
gbase> SELECT table_schema,table_name,table_rows FROM
information_schema.tables WHERE table_schema='test' AND table_name = 'tx1';
+--------------+------------+------------+
| table_schema | table_name | table_rows |
+--------------+------------+------------+
| test | tx1 | 0 |
+--------------+------------+------------+
1 row in set
gbase> USE test;
Query OK, 0 rows affected
gbase> RENAME TABLE test.tx1 to test.tx_1;
Query OK, 0 rows affected
gbase> SELECT table_schema,table_name,table_rows FROM
information_schema.tables WHERE table_schema='test' AND table_name = 'tx_1';
+--------------+------------+------------+
| table_schema | table_name | table_rows |
+--------------+------------+------------+
| test | tx_1 | 0 |
+--------------+------------+------------+
1 row in set
TRUNCATE TABLE
语法格式:
TRUNCATE [TABLE] [database_name.]table_name;
参数说明如下:
database_name:可选参数,表示表隶属的数据库名称。如果省略此参数,即为 USE 后的数据库名称。
table_name:是要删除其全部行的表的名称。
功能:
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。
示例 1:删除表 b 中的所有行。
gbase> USE test;
Query OK, 0 rows affected
gbase> CREATE TABLE b (a decimal(12,5) DEFAULT NULL, KEY idx_a (a) USING HASH
GLOBAL);
Query OK, 0 rows affected
gbase> INSERT INTO b VALUES(1),(2),(3);
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
gbase> SELECT * FROM b;
+---------+
| a |
+---------+
| 1.00000 |
| 2.00000 |
| 3.00000 |
+---------+
3 rows in set
gbase> TRUNCATE TABLE b;
Query OK, 3 rows affected
gbase> SELECT * FROM b;
Empty set
DROP TABLE
语法格式:
DROP [TEMPORARY] TABLE [IF EXISTS] [database_name.]table_name
参数说明如下:
TEMPORARY:该参数为可选参数,删除临时表时建议使用此关键字。
IF EXISTS:用户可以使用关键词 IF EXISTS 防止表不存在时报告错误。当使用 IF EXISTS 时,对于不存在的表,用户将得到一个 WARNING。
使用 DROP TABLE 移除一个表时,将移除所有的数据和表定义,用户必须有表的 DROP 权限,所以,一定要小心地使用这个命令!