开发者社区> 问答> 正文

如何使用CREATE TABLE数据定义语言


该语句用于在OceanBase数据库中创建新表。
格式 CREATE TABLE [IF NOT EXIST] tblname
(create_definition,...)
[table_options]
[partition_options];

CREATE TABLE [IF NOT EXISTS] tblname
  LIKE oldtblname;

create_definition:
   colname column_definition
   | PRIMARY KEY (index_col_name[, index_col_name...]) [index_option]...
   | {INDEX|KEY} [indexname] (index_col_name,...) [index_option]...
   | UNIQUE {INDEX|KEY} [indexname] (index_col_name,...) [index_option]...

column_definition:
     data_type [NOT NULL | NULL] [DEFAULT defaultvalue]
      [AUTO_INCREMENT] [UNIQUE [KEY]] | [[PRIMARY] KEY]
      [COMMENT 'string']

data_type:
  TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  | INT[(length)] [UNSIGNED] [ZEROFILL]
  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | DATE
  | TIME[(fsp)]
  | TIMESTAMP[(fsp)]
  | DATETIME[(fsp)]
  | YEAR
  | CHAR[(length)]
      [CHARACTER SET charsetname] [COLLATE collationname]
  | VARCHAR(length)
      [CHARACTER SET charsetname] [COLLATE collationname]
  | BINARY[(length)]
  | VARBINARY(length)
index_col_name:
     colname [(length)] [ASC | DESC](OceanBase1.0暂不支持前缀索引)

index_option:
    GLOBAL [LOCAL]
    |COMMENT 'string'
    |COMPRESSION [=] '{NONE | LZ4_1.0 | LZO_1.0 | SNAPPY_1.0 | ZLIB_1.0}'
    |BLOCK_SIZE [=] size
    |STORING(columname_list)

table_options:
     table_option [[,] table_option]...

table_option:
    [DEFAULT] { CHARACTER SET | CHARSET } [=] value
    | [DEFAULT] COLLATE [=] collationname
    | COMMENT [=] 'comment string'
    | COMPRESSION [=] '{NONE | LZ4_1.0 | LZO_1.0 | SNAPPY_1.0 | ZLIB_1.0}'
    | EXPIRE_INFO [=] (expr)
    | REPLICA_NUM [=] num
    | TABLE_ID [=] id
    | BLOCK_SIZE [=] size
    | USE_BLOOM_FILTER [=] {True| False}
    | PROGRESSIVE_MERGE_NUM [=] num
    | TABLEGROUP [=] 'tablegroupname'
    | PRIMARY_ZONE [=] 'zone'
    | AUTO_INCREMENT [=] num

partition_options:
     PARTITION BY
         HASH(expr)
         |KEY(column_list)
         [PARTITIONS num]
         [partition_definition ...]

partition_definition:
    COMMENT [=] 'string' (暂不支持)


OceanBase内部数据以b树为索引,按照Primary Key排序。OceanBase 0.4.2及以前版本不允许用户创建只有主键列的表;OceanBase 0.5.0及以上版本支持创建只有主键列的表。OceanBase 1.0可以不指定主键,系统会自动生成。
CREATE TABLE支持UNIQUE约束;暂不支持创建临时表,暂不支持CHECK约束;不支持创建表的同时从其他表导入功能。

  • 使用“IF NOT EXISTS”时,即使创建的表已经存在,也不会报错,如果不指定时,则会报错。
  • “data_type”请参见数据类型章节。
  • NOT NULL,DEFAULT,AUTO_INCREMENT用于列的完整性约束。
  • “table_option”内容参考下表,各子句间用“,”隔开。
  • “index_option”中,可以指定GLOBAL,LOCAL关键字,表述全局或局部索引。默认是GLOBAL index。创建带有Parition的表时index一定要加LOCAL关键字。如果没有加,系统将报错。
    参数含义举例
    CHARACTER SET指定该表所有字符串的编码,用于对外提供元数据信息。目前仅支持UTF8MB4。CHARACTER SET = 'utf8mb4'
    COMMENT添加注释信息。COMMENT='create by Bruce'
    COMPRESSION存储数据时使用的压缩方法名,目前提供的方法有以下几种: · none(默认值,表示不作压缩)· LZ4_1.0 · LZO_1.0 · SNAPPY_1.0 · ZLIB_1.0COMPRESSION = 'NONE'
    EXPIRE_INFO在MemTable中的动态数据和SSTable中的静态数据合并时,满足表达式的行会自动删除。一般可用于自动删除过期数据。expire_info c1 < date_add(merging_frozen_time(),interval -1 HOUR); merging_frozen_time()表示当前最新的合并时间,此函数只适用于过期条件。
    TABLE_ID指定表的ID。如果指定的table_id小于50000,需要打开RootServer的配置项开关“enable_sys_table_ddl”,普通用户不建议指定。TABLE_ID =4000
    BLOCK_SIZE设置Partition的微块大小。默认为16K。
    USE_BLOOM_FILTER对本表读取数据时,是否使用Bloom Filter。 · False:默认值,不使用。· True:使用。USE_BLOOM_FILTER = False
    PROGRESSIVE_MERGE_NUM设置渐近合并步数。PROGRESSIVE_MERGE_NUM现在在限制是1~64。默认值为1。PROGRESSIVE_MERGE_NUM = 5
    TABLEGROUP表所属表格组。
    REPLICA_NUM这个表的partition总副本数,默认值为3。REPLICA_NUM = 3
    ZONE_LIST集群列表
    PRIMARY_ZONE主集群。
    AUTO_INCREMENT自增字段初始值AUTO_INCREMENT = 5

AUTO_INCREMENT基本说明
在OceanBase中可以把表中的数据类型为整数型的某个字段定义为自增属性AUTO_INCREMENT,数据库会自动递增方式生产唯一值。
允许给TINYINT、SMALLINT、MEDIUMINT、INT、INTEGER、BIGINT各种整数类型的字段指定AUTO_INCREMENT,其它数据类型的字段不能指定AUTO_INCREMENT。
一个表只允许有一个属性为AUTO_INCREMENT的字段。 Oceanbase>create table t1 (id int auto_increment,name varchar(20) primary key);
Query OK, 0 rows affected (0.01 sec)



举例


例1:
执行以下命令,创建数据库表。 ceanbase>CREATE TABLE test (c1 int primary key, c2 varchar(10)) REPLICA_NUM = 3, COMPRESSION = 'NONE';
Query OK, 0 rows affected (0.40 sec)


执行命令查看表信息,如: Oceanbase>describe test;
+-------+-------------+------+------+---------+-------+
| Field | Type        | Null | Key  | Default | Extra |
+-------+-------------+------+------+---------+-------+
| c1    | int(11)     | NO   | PRI  | NULL    |       |
| c2    | varchar(10) | YES  |      | NULL    |       |
+-------+-------------+------+------+---------+-------+
2 rows in set (0.01 sec)


例2: Oceanbase>CREATE TABLE example_2(custid INT,
thedate TIMESTAMP, cost INT, PRIMARY KEY(custid, thedate))
EXPIRE_INFO = (thedate < date_sub(merging_frozen_time(), INTERVAL 2 DAY)),  USE_BLOOM_FILTER = FALSE;
Query OK, 0 rows affected (0.11 sec)


(thedate < date_sub(merging_frozen_time(), INTERVAL 2 DAY)),表示删除(过期)thedate字段值为2天前的数据,删除数据动作在数据合并时候真正执行。其中 merging_frozen_time()表示当前最新的合并时间。(merging_frozen_time()只能放在过期条件中使用)

展开
收起
云栖大讲堂 2017-11-01 15:35:12 2677 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Facebook Online Schema Change原理和大规模表结构变更最佳实践 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载