Skip to content

数据定义语言(DDL)

本章节将介绍 Ignite 3 支持的所有数据定义语言(DDL)命令。

1.CREATE TABLE

创建一张新表。

提示

这个操作也可以通过 Java API 来实现。

CREATETABLEIF NOT EXISTStable_name(constraintcolumn_definition,)COLOCATEBY(column_list)
ZONEzone_nameSTORAGE PROFILEprofile_name

关键字和参数:

  • IF NOT EXISTS:仅当不存在同名的表时,才创建表;
  • COLOCATE BY:关联键,其可以是多个字段,主键必须包含关联键;
  • ZONE:设置分布区,可以指定为区分大小写的字符串或不区分大小写的标识符。在建表时不需要存在,可以在写入数据之前创建;
  • STORAGE PROFILE:设置将用于存储表的存储配置,必须指定为区分大小写的字符串。

示例:

创建一个 Person 表:

sql
CREATE TABLE IF NOT EXISTS Person (
  id int primary key,
  city_id int,
  name varchar,
  age int,
  company varchar
)

创建使用的MYZONE分布区的 Person 表:

sql
CREATE TABLE IF NOT EXISTS Person (
  id int primary key,
  city_id int,
  name varchar,
  age int,
  company varchar
) ZONE MYZONE

创建一个使用default存储配置的 Person 表,而不考虑分布区中指定的存储配置:

sql
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

sql
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

在已有的表中添加新的列。

ALTER TABLEIF EXISTSqualified_table_nameADDCOLUMN

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错。

示例:

在表中添加一个列:

sql
ALTER TABLE Person ADD COLUMN city varchar;

如果表存在则添加一个列:

sql
ALTER TABLE IF EXISTS Person ADD number bigint;

表中一次添加多个列:

sql
ALTER TABLE Person ADD COLUMN (code varchar, gdp double);

ALTER TABLE IF EXISTS table DROP COLUMN

从已有的表中删除列,删除列后,将无法在查询中访问该列,此命令具有以下限制:

  • 如果该列存在索引,则必须使用 DROP INDEX 命令提前手动删除索引;
  • 如果该列表示表中存储的整个值,则无法删除该列,此限制与基本类型相关。
ALTER TABLEIF EXISTSqualified_table_nameDROPCOLUMN

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错。

示例:

从表中删除一列:

sql
ALTER TABLE Person DROP COLUMN city;

如果该表存在则删除一列:

sql
ALTER TABLE IF EXISTS Person DROP COLUMN number;

表中一次删除多个列:

sql
ALTER TABLE Person DROP COLUMN (code, gdp);

ALTER TABLE IF EXISTS table ALTER COLUMN column SET DATA TYPE

修改表中某字段的数据类型。

ALTER TABLEIF EXISTSqualified_table_nameALTER COLUMNcolumn_name_or_list
SET DATA TYPEdata_type(NULLABLENOT NULL)

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错;
  • DATA TYPE:有效的数据类型

示例:

修改表中一列的数据类型:

sql
ALTER TABLE Person ALTER COLUMN city SET DATA TYPE varchar;

支持的转换:

不是支持所有的数据类型转换,有如下的限制:

  • FLOAT:可以被转换成DOUBLE
  • INT8INT16INT32可以被转换成INT64
  • 类型的标度不可以修改;
  • 对于飞主键的DECIMAL类型,精度可以增加;
  • 非主键的STRINGBYTE_ARRAY类型,长度可以增加。

其他的转换是不支持的。

示例:

age字段的类型转换成BIGINT

sql
ALTER TABLE Person ALTER COLUMN age SET DATA TYPE BIGINT

将一个文本列的长度修改成11:

sql
ALTER TABLE Person ALTER COLUMN Name SET DATA TYPE varchar(11)

ALTER TABLE IF EXISTS table ALTER COLUMN column SET NOT NULL

ALTER TABLEIF EXISTSqualified_table_nameALTER COLUMNcolumn_name_or_list
SET NOT NULL

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错。

支持的转换:

不是支持所有数据类型的转换,有如下的限制:

  • NULLABLENOT NULL的转换是不支持的。

ALTER TABLE IF EXISTS table ALTER COLUMN column DROP NOT NULL

ALTER TABLEIF EXISTSqualified_table_nameALTER COLUMNcolumn_name_or_list
DROP NOT NULL

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错。

支持的转换:

不是支持所有数据类型的转换,有如下的限制:

  • NOT NULLNULLABLE的转换对于任何非主键字段都是可以的。

ALTER TABLE IF EXISTS table ALTER COLUMN column SET DEFAULT

ALTER TABLEIF EXISTSqualified_table_nameALTER COLUMNcolumn_name_or_list
SET DATA TYPEdata_typeNULLNOT NULLDEFAULTliteral_value

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错。

ALTER TABLE IF EXISTS table ALTER COLUMN column DROP DEFAULT

ALTER TABLEIF EXISTSqualified_table_nameALTER COLUMNcolumn_name_or_list
DROP DEFAULT

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错。

3.DROP TABLE

DROP TABLE命令会删除一个现有的表。该表将被标记为删除,并在达到低水位线后通过垃圾回收删除。在数据被删除之前,它还可用于只读事务,这些事务检查表被标记为删除之前的时间。

提示

这个操作也可以通过 Java API 来实现。

DROP TABLEIF EXISTSqualified_table_name

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错。

示例:

删除已有的Person表:

sql
DROP TABLE IF EXISTS "Person";

4.CREATE INDEX

新建一个索引。

提示

这个操作也可以通过 Java API 来实现。

创建新索引时,只有在之前发起的所有事务都完成后,才会开始构建。如果集群的逻辑拓扑中存在任何挂起的事务,则不会启动索引创建。

索引的状态和状态描述都会反映在系统视图中。

提示

索引不能多次包含同一列。

CREATE INDEXIF NOT EXISTSnameONqualified_table_name

关键字和参数:

  • IF NOT EXISTS:只有同名索引不存在才会创建该索引;
  • name:索引名;
  • ON:在该表上创建索引;
  • USING TREE:如果指定,创建树结构索引;
  • USING HASH:如果指定,创建哈希索引。

示例:

Person表创建department_name_idx索引:

sql
CREATE INDEX IF NOT EXISTS department_name_idx ON Person (department_id DESC, name ASC);

Person表创建名为department_name_idx的哈希索引:

sql
CREATE INDEX name_surname_idx ON Person USING HASH (name, surname);

Person表创建名为department_city_idx的树结构索引:

sql
CREATE INDEX department_city_idx ON Person USING TREE (department_id ASC, city_id DESC);

5.DROP INDEX

删除索引。

提示

这个操作也可以通过 Java API 来实现。

删除索引后,在之前发起的事务(即使是不影响要删除索引的任何表的事务)执行完成之前,索引会处于 STOPPING 状态。完成上述所有事务后,仅当相关分区的 LWM 大于激活索引删除的时间时,才会释放已删除索引所占用的空间。索引状态和状态描述都会反映在系统视图中。

DROP INDEXIF EXISTSindex_name

关键字和参数:

  • IF EXISTS:如果指定的表不存在不会报错;
  • index_name:索引名。

示例:

删除已有的一个索引。

sql
DROP INDEX IF EXISTS department_name_idx;

18624049226