数据定义语言(DDL)
本章节将介绍 Ignite 3 支持的所有数据定义语言(DDL)命令。
1.CREATE TABLE
创建一张新表。
提示
这个操作也可以通过 Java API 来实现。
关键字和参数:
IF NOT EXISTS
:仅当不存在同名的表时,才创建表;COLOCATE BY
:关联键,其可以是多个字段,主键必须包含关联键;ZONE
:设置分布区,可以指定为区分大小写的字符串或不区分大小写的标识符。在建表时不需要存在,可以在写入数据之前创建;STORAGE PROFILE
:设置将用于存储表的存储配置,必须指定为区分大小写的字符串。
示例:
创建一个 Person
表:
CREATE TABLE IF NOT EXISTS Person (
id int primary key,
city_id int,
name varchar,
age int,
company varchar
)
创建使用的MYZONE
分布区的 Person
表:
CREATE TABLE IF NOT EXISTS Person (
id int primary key,
city_id int,
name varchar,
age int,
company varchar
) ZONE MYZONE
创建一个使用default
存储配置的 Person
表,而不考虑分布区中指定的存储配置:
CREATE TABLE IF NOT EXISTS Person (
id int primary key,
city_id int,
name varchar,
age int,
company varchar
) PRIMARY ZONE MYZONE STORAGE PROFILE 'default'
创建一个 Person
表,city_id
列的默认值为1
:
CREATE TABLE IF NOT EXISTS Person (
id int primary key,
city_id int default 1,
name varchar,
age int,
company varchar
)
2.ALTER TABLE
修改一个已有表的表结构。
ALTER TABLE IF EXISTS table ADD COLUMN
在已有的表中添加新的列。
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错。
示例:
在表中添加一个列:
ALTER TABLE Person ADD COLUMN city varchar;
如果表存在则添加一个列:
ALTER TABLE IF EXISTS Person ADD number bigint;
表中一次添加多个列:
ALTER TABLE Person ADD COLUMN (code varchar, gdp double);
ALTER TABLE IF EXISTS table DROP COLUMN
从已有的表中删除列,删除列后,将无法在查询中访问该列,此命令具有以下限制:
- 如果该列存在索引,则必须使用
DROP INDEX
命令提前手动删除索引; - 如果该列表示表中存储的整个值,则无法删除该列,此限制与基本类型相关。
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错。
示例:
从表中删除一列:
ALTER TABLE Person DROP COLUMN city;
如果该表存在则删除一列:
ALTER TABLE IF EXISTS Person DROP COLUMN number;
表中一次删除多个列:
ALTER TABLE Person DROP COLUMN (code, gdp);
ALTER TABLE IF EXISTS table ALTER COLUMN column SET DATA TYPE
修改表中某字段的数据类型。
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错;DATA TYPE
:有效的数据类型。
示例:
修改表中一列的数据类型:
ALTER TABLE Person ALTER COLUMN city SET DATA TYPE varchar;
支持的转换:
不是支持所有的数据类型转换,有如下的限制:
FLOAT
:可以被转换成DOUBLE
;INT8
、INT16
和INT32
可以被转换成INT64
;- 类型的标度不可以修改;
- 对于飞主键的
DECIMAL
类型,精度可以增加; - 非主键的
STRING
和BYTE_ARRAY
类型,长度可以增加。
其他的转换是不支持的。
示例:
将age
字段的类型转换成BIGINT
:
ALTER TABLE Person ALTER COLUMN age SET DATA TYPE BIGINT
将一个文本列的长度修改成11:
ALTER TABLE Person ALTER COLUMN Name SET DATA TYPE varchar(11)
ALTER TABLE IF EXISTS table ALTER COLUMN column SET NOT NULL
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错。
支持的转换:
不是支持所有数据类型的转换,有如下的限制:
- 从
NULLABLE
到NOT NULL
的转换是不支持的。
ALTER TABLE IF EXISTS table ALTER COLUMN column DROP NOT NULL
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错。
支持的转换:
不是支持所有数据类型的转换,有如下的限制:
NOT NULL
到NULLABLE
的转换对于任何非主键字段都是可以的。
ALTER TABLE IF EXISTS table ALTER COLUMN column SET DEFAULT
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错。
ALTER TABLE IF EXISTS table ALTER COLUMN column DROP DEFAULT
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错。
3.DROP TABLE
DROP TABLE
命令会删除一个现有的表。该表将被标记为删除,并在达到低水位线后通过垃圾回收删除。在数据被删除之前,它还可用于只读事务,这些事务检查表被标记为删除之前的时间。
提示
这个操作也可以通过 Java API 来实现。
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错。
示例:
删除已有的Person
表:
DROP TABLE IF EXISTS "Person";
4.CREATE INDEX
新建一个索引。
提示
这个操作也可以通过 Java API 来实现。
创建新索引时,只有在之前发起的所有事务都完成后,才会开始构建。如果集群的逻辑拓扑中存在任何挂起的事务,则不会启动索引创建。
索引的状态和状态描述都会反映在系统视图中。
提示
索引不能多次包含同一列。
关键字和参数:
IF NOT EXISTS
:只有同名索引不存在才会创建该索引;name
:索引名;ON
:在该表上创建索引;USING TREE
:如果指定,创建树结构索引;USING HASH
:如果指定,创建哈希索引。
示例:
为Person
表创建department_name_idx
索引:
CREATE INDEX IF NOT EXISTS department_name_idx ON Person (department_id DESC, name ASC);
为Person
表创建名为department_name_idx
的哈希索引:
CREATE INDEX name_surname_idx ON Person USING HASH (name, surname);
为Person
表创建名为department_city_idx
的树结构索引:
CREATE INDEX department_city_idx ON Person USING TREE (department_id ASC, city_id DESC);
5.DROP INDEX
删除索引。
提示
这个操作也可以通过 Java API 来实现。
删除索引后,在之前发起的事务(即使是不影响要删除索引的任何表的事务)执行完成之前,索引会处于 STOPPING
状态。完成上述所有事务后,仅当相关分区的 LWM 大于激活索引删除的时间时,才会释放已删除索引所占用的空间。索引状态和状态描述都会反映在系统视图中。
关键字和参数:
IF EXISTS
:如果指定的表不存在不会报错;index_name
:索引名。
示例:
删除已有的一个索引。
DROP INDEX IF EXISTS department_name_idx;
18624049226