创建表
数据库启动完成后,可自定义基表保存用户数据。
主要语法结构
语法格式
sql
createtabstmt::=
CREATE [opt_temp] TABLE [opt_if_not_exists] [schema.] tab_name (table_elements)
[on_commit_del] [opt_partitioning_clause] [opt_subpartitioning_clause]
[opt_constraint_props] [opt_store_props] [opt_comment]
参数说明
CREATE
:关键字,表示创建操作。[opt_temp]
:可选参数,用于指定创建的是临时表。有效选项包括:TEMPORARY
TEMP
LOCAL TEMPORARY
LOCAL TEMP
GLOBAL TEMPORARY
GLOBAL TEMP
TABLE
:关键字,表示创建的对象是表。[opt_if_not_exists]
:可选参数,如果表已经存在,则不执行创建操作。使用 IF NOT EXISTS 关键字。[schema.]
:可选参数,用于指定表所属的模式。如果省略,则使用默认模式。tab_name
:表的名称。(table_elements)
:括号内定义表的列和其他元素。[on_commit_del]
:对于临时表,定义事务提交后如何处理临时表的数据。[opt_partitioning_clause]
:指定表的分区信息,有助于提高大型表的查询性能。[opt_subpartitioning_clause]
:子分区信息,进一步细化分区规则。[opt_constraint_props]
:表级别的约束属性,如主键、外键、唯一性等。[opt_store_props]
:存储属性,比如存储位置、文件格式等。[opt_comment]
:对表或列的注释,方便后续管理和维护。
表元素定义table_elements
语法格式
sql
table_elements::=
col_elements[,col_elements]...
参数说明
col_elements
:定义表的列和其他元素。
列元素定义col_elements
语法格式
sql
col_elements::=
col_name type [IDENTITY(B,S)] [NOT NULL | NULL] [DEFAULT default_value]
[UNIQUE | PRIMARY KEY | CHECK(expression)]
[COMMENT 'string'] [reference_definition]
| CONSTRAINT name [CHECK(expression) | UNIQUE(columnList) | PRIMARY KEY(columnList) | FOREIGN KEY opt_fk_name(columnList) reference_definition]
参数说明
col_name type [IDENTITY(B,S)] [NOT NULL | NULL] [DEFAULT default_value]
:定义列的基本属性。col_name
:列名。type
:列的数据类型。[IDENTITY(B,S)]
:可选参数,表示列是否为自增列及其起始值和步长。[NOT NULL | NULL]
:可选参数,指定列是否允许空值。[DEFAULT default_value]
:可选参数,指定列的默认值。
[UNIQUE | PRIMARY KEY | CHECK(expression)]
:可选参数,用于定义列级别的唯一性、主键或检查约束。UNIQUE
: 列的值必须唯一。PRIMARY KEY
: 列为主键。CHECK(expression)
: 列值必须满足某个条件。
[COMMENT 'string']
:可选参数,为列添加注释。[reference_definition]
:可选参数,用于定义外键约束。CONSTRAINT name [CHECK(expression) | UNIQUE(columnList) | PRIMARY KEY(columnList) | FOREIGN KEY opt_fk_name(columnList) reference_definition]
:对表中列或列的组合设置的一种限制条件。name
: 约束的名称,用于标识该约束。CHECK(expression)
: 检查约束,确保列的值满足某个条件。UNIQUE(columnList)
: 唯一约束,确保指定列的组合值是唯一的。PRIMARY KEY(columnList)
: 主键约束,确保指定列的组合值是唯一的,并且不允许为空。FOREIGN KEY opt_fk_name(columnList) reference_definition
: 外键约束,确保指定列的值引用另一个表中的主键值。opt_fk_name
: 可选的外键名称。columnList
: 要定义为外键的列列表。
外键定义reference_definition
语法格式
sql
reference_definition::=
REFERENCES tbl_name [(index_col_name,...)]
[ON {UPDATE | DELETE} {CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON DELETE {CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
参数说明
REFERENCES tbl_name [(index_col_name,...)]
:指定外键引用的目标表及列。tbl_name
: 引用的表的名称。index_col_name,...
: 引用表中的列列表。通常情况下,这些列是引用表的主键或唯一键。
[ON UPDATE {CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
:可选参数,定义更新操作时的行为。[ON DELETE {CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
:可选参数,定义删除操作时的行为。CASCADE
: 表示当父表记录变更时子表受影响记录的相应字段值随之变更,当父表记录删除时,子表中受影响记录跟着删除。SET NULL
: 表示父表更改或删除,子表记录的相应字段值置为空值。NO ACTION
: 表示当父表记录变更时,导致子表中某些记录不再满足外键约束,系统将禁止父表作变更,其效果为更改父表的事务将被回滚。SET DEFAULT
: 表示父表更改或删除时,子表相应记录的相应字段值置为默认值,若该字段无默认值则置空。
事务提交行为on_commit_del
语法格式
sql
on_commit_del::=
ON COMMIT DELETE ROWS
| ON COMMIT PRESERVE ROWS
参数说明
ON COMMIT DELETE ROWS
:当事务提交时,删除临时表中的所有行。ON COMMIT PRESERVE ROWS
:当事务提交时,保留临时表中的行。
表一级分区定义opt_partitioning_clause
语法格式
sql
opt_partitioning_clause::=
PARTITION BY RANGE (name_list) [INTERVAL expr {DAY|MONTH|YEAR}] PARTITIONS (range_parti_item[,range_parti_item]...)
| PARTITION BY LIST (name_list) PARTITIONS (list_parti_item[,list_parti_item]...)
| PARTITION BY HASH (name_list) PARTITIONS ICONST
| PARTITION BY HASH (name_list) PARTITIONS (name_list)
参数说明
PARTITION BY RANGE (name_list) [INTERVAL expr {DAY|MONTH|YEAR}] PARTITIONS (range_parti_item[,range_parti_item]...)
:按范围分区。PARTITION BY LIST (name_list) PARTITIONS (list_parti_item[,list_parti_item]...)
:按列表分区。PARTITION BY HASH (name_list) PARTITIONS ICONST
:按哈希值分区,ICONST 是分区的数量。PARTITION BY HASH (name_list) PARTITIONS (name_list)
:按哈希值分区,name_list 是分区的名称列表。
表二级分区定义opt_subpartitioning_clause
语法格式
sql
opt_subpartitioning_clause::=
SUBPARTITION BY HASH (name_list) SUBPARTITIONS ICONST
| SUBPARTITION BY HASH (name_list) SUBPARTITIONS (name_list)
| SUBPARTITION BY LIST (name_list) SUBPARTITIONS (list_parti_item[,list_parti_item]...)
| SUBPARTITION BY RANGE (name_list) SUBPARTITIONS (range_parti_item[,range_parti_item]...)
参数说明
SUBPARTITION BY HASH (name_list) SUBPARTITIONS ICONST
:定义哈希子分区。SUBPARTITION BY HASH (name_list) SUBPARTITIONS (name_list)
:定义哈希子分区,使用名称列表。SUBPARTITION BY LIST (name_list) SUBPARTITIONS (list_parti_item[,list_parti_item]...)
:定义列表子分区。SUBPARTITION BY RANGE (name_list) SUBPARTITIONS (range_parti_item[,range_parti_item]...)
:定义范围子分区。
列约束属性opt_constraint_props
语法格式
sql
opt_constraint_props::=
UNIQUE (name_list)
| PRIMARY KEY
| CONSTRAINT colid
| [UNIQUE (name_list) | PRIMARY KEY | CONSTRAINT colid]...
参数说明
UNIQUE (name_list)
:定义唯一性约束。PRIMARY KEY
:定义主键约束。CONSTRAINT colid
:定义约束的名称。[UNIQUE (name_list) | PRIMARY KEY | CONSTRAINT colid]...
:可以定义多个约束。
表存储定义信息store_prop
语法格式
sql
store_prop::=
PCTFREE expr
| PCTUSED expr
| COPY NUMBER expr
| {COMPRESS|NOCOMPRESS}
参数说明
PCTFREE expr
:定义块中预留的空间百分比。PCTUSED expr
:定义块中已使用的空间百分比。COPY NUMBER expr
:定义复制的数量。{COMPRESS|NOCOMPRESS}
:定义是否压缩数据。
注释opt_comment
语法格式
sql
opt_comment::=
COMMENT SCONST
参数说明
COMMENT 'string'
:为表或列添加注释。
示例
示例1
在sysdba模式下创建一张名为test_tab的表,该表包含6列,该表按照“所属省份”进行列表分区,分区键值包括:北京、四川、重庆以及其他值(若无OTHERVALUES分区,插入所属省份值非指定列表中的值则无法插入,OTHERVALUES范围分区中对应MAXVALUES),并且指定该表存储版本数为2(COPY NUMBER在多节点下有效且不能大于3;单机默认为1,指定大于1无效)。sqlSQL> CREATE TABLE sysdba.test_tab( -- 列定义并给每列添加注释 kid INT IDENTITY(1,1) COMMENT '身份ID', name CHAR(10) NOT NULL COMMENT '姓名', age TINYINT DEFAULT '0' COMMENT '年龄', birth DATETIME COMMENT '生日', proc VARCHAR(10) COMMENT '所属省份', comments VARCHAR COMMENT '备注') -- 分区定义 PARTITION BY LIST(proc) PARTITIONS(('北京'),('四川'),('重庆'),(OTHERVALUES))COPY NUMBER 2;
示例2
在sysdba模式下创建一张人员信息表test_tab2,该表以生日字段进行范围分区,且该分区为自动扩展分区,起始分区为1900年1月1日,后续系统将根据插入生日时间进行自动扩展。sqlSQL> CREATE TABLE sysdba.test_tab2( -- 列定义并给每列添加注释 kid INT IDENTITY(1,1) COMMENT '身份ID', name CHAR(10) NOT NULL COMMENT '姓名', age TINYINT DEFAULT '0' COMMENT '年龄', birth DATETIME COMMENT '生日', proc VARCHAR(10) COMMENT '所属省份', comments VARCHAR COMMENT '备注') -- 分区定义 PARTITION BY RANGE(birth) INTERVAL 1 MONTH PARTITIONS(part1 VALUES LESS THAN('1900-01-01 00:00:00')) -- 给表添加注释 COMMENT '人员信息表';
示例3
创建一个与原表同名但属性不同的表,此操作不会对原表产生影响。sqlSQL> CREATE TABLE test_tab(id int); SQL> SELECT dt.table_name,dt.table_type FROM dba_tables dt WHERE dt.table_name='TEST_TAB'; TABLE_NAME | TABLE_TYPE | ------------------------------------------------------------------------------ TEST_TAB| 0 | SQL> SELECT * FROM test_tab; ID ------------------------------------------------------------------------------ -- 创建一个与原不表不同列属性的表此处会返回警告 SQL> CREATE TABLE IF NOT EXISTS test_tab(id int,name varchar(20)); Warnning: [E9016] 同名Table对象TEST_TAB已存在 -- 上述操作不对原表产生影响 SQL> SELECT dt.table_name,dt.table_type FROM dba_tables dt WHERE dt.table_name='TEST_TAB'; TABLE_NAME | TABLE_TYPE | ------------------------------------------------------------------------------ TEST_TAB| 0 | SQL> SELECT * FROM test_tab; ID ------------------------------------------------------------------------------