推特 阿里云技术文档正文

CREATE TABLE_DDL_SQL手册_分析型数据库MySQL版

admin 阿里云技术文档 2020-02-11 191 0
阿里云服务器优惠

CREATE TABLE

CREATE TABLE用于在AnalyticDB for MySQL中创建表。

语法

  1. CREATE TABLE [IF NOT EXISTS] table_name
  2. ({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'string']
  3. | table_constraints}
  4. [, ... ] )
  5. table_attribute
  6. [partition_options]
  7. [AS] query_expression
  8. COMMENT 'string'
  9. column_attributes:
  10. [DEFAULT default_expr]
  11. [AUTO_INCREMENT]
  12. column_constraints:
  13. [{NOT NULL|NULL} ]
  14. [PRIMARY KEY]
  15. table_constraints:
  16. [{INDEX|KEY} [index_name] (column_name,...)]
  17. [PRIMARY KEY [index_name] (column_name,...)]
  18. [CLUSTERED KEY [index_name] (column_name,...)]
  19. table_attribute:
  20. DISTRIBUTED BY HASH(column_name,...) | DISTRIBUTED BY BROADCAST
  21. partition_options:
  22. PARTITION BY
  23. {VALUE(column_name) | VALUE(date_format(column_name, ?)}
  24. [LIFECYCLE N]

参数

参数说明
table_name表名。

表名以字母或下划线(_)开头,可包含字母、数字以及下划线(_),长度为1到127个字符。

支持db_name.table_name格式,区分不同数据库下相同名字的表。

column_name列名。

列名以字母或下划线(_)开头,可包含字母、数字以及下划线(_),长度为1到127个字符。

column_type要添加的列的数据类型。

AnalyticDB for MySQL支持的数据类型请参见数据类型

column_attributes
  • DEFAULT default_expr:设置列的默认值,DEFAULT为无变量表达式,例如current_timestamp

    如果未指定默认值,则列的默认值为NULL

  • AUTO_INCREMENT:定义自增列,可选项。

    自增列的数据类型必须是bigint类型,AnalyticDB for MySQL为自增列提供唯一值,但自增列的值不是顺序递增。

column_constraints
  • NOT NULL|NULL:定义了NOT NULL的列不允许值为NULL;定义了NULL(默认值)的列允许值为NULL
  • PRIMARY KEY :定义主键。

    如果有多个主键,语法为PRIMARY KEY(column_name [, ... ])

table_constraintsINDEX|KEY:倒排索引。

AnalyticDB for MySQL默认为表创建全索引,一般情况下无须手动创建索引。

PRIMARY KEY主键索引。
  • 只有定义过主键的表支持DELETE和UPDATE操作。
  • 主键中必须包含分区键,建议把分区键放到组合主键之前。
CLUSTERED KEY聚集索引,定义表中的排序列,聚集索引中键值的逻辑顺序决定了表中相应行的物理顺序,每个表仅支持创建一个聚集索引。

例如,clustered key col5_col6_cls_index(col5,col6) 定义了col5 col6的聚集索引,col5 col6col6 col5是不同的聚集索引。

聚集索引可以对整个表进行排序,例如电商交易表中按照seller_id做聚集索引,每个卖家只访问自己的数据(WHERE条件中使用seller_id),避免随机访问,提高数据查询效率。CDN用户按照user_id做聚集列全局排序,实际业务中CDN用户可以快速访问自己的日志,效率也更高。

聚集列有以下限制:

  • 每张表中只支持创建一个聚集列索引。
  • 由于聚集索引会进行全表排序,导致数据写入性能下降、CPU占用较高,因此一般不建议使用聚集索引。
  • 聚集列索引和索引下推之间没有关系。
DISTRIBUTED BY HASH(column_name,...)在普通表中定义表的分布键,按照column_name的HASH值进行分区。

AnalyticDB for MySQL支持将多个字段作为分区键。

DISTRIBUTED BY BROADCAST用于定义维度表,维度表会在集群的每个节点存储一份数据,因此建议维度表的数据量不宜太大。
partition_options普通表中定义分区。

AanlyticDB for MySQL通过LIFECYCLE N方式实现表生命周期管理,即对分区进行排序,超出N的分区将被过滤掉。

例如,PARTITION BY VALUE(column_name) 表示使用column_name的值来做分区,PARTITION BY VALUE(DATE_FORMAT(column_name, '%Y%m%d')) 表示将column_name格式化为类似20190101的日期格式做分区。LIFECYCLE 365表示每个节点最多保留的分区个数为365,即如果数据保存天数为365天,则第366天写入数据后,系统会自动删除第1天写入的数据。

注意事项

  • 创建表时,AnalyticDB for MySQL集群默认编码格式为utf-8,相当于MySQL中的utf8mp4编码,暂不支持其他编码格式。

  • 目前AnalyticDB for MySQL集群支持创建的最大表数目是节点组数目*256

示例

  • 新建TEST表。

    1. create table test (
    2. id bigint auto_increment,
    3. name varchar,
    4. value int,
    5. ts timestamp
    6. )
    7. DISTRIBUTED BY HASH(id)

    TEST为普通表,id为自增列,分布键为id,按照id值进行HASH分区。

  • 新建CUSTOMER表。

    1. CREATE TABLE customer (
    2. customer_id bigint NOT NULL COMMENT '顾客ID',
    3. customer_name varchar NOT NULL COMMENT '顾客姓名',
    4. phone_num bigint NOT NULL COMMENT '电话',
    5. city_name varchar NOT NULL COMMENT '所属城市',
    6. sex int NOT NULL COMMENT '性别',
    7. id_number varchar NOT NULL COMMENT '身份证号码',
    8. home_address varchar NOT NULL COMMENT '家庭住址',
    9. office_address varchar NOT NULL COMMENT '办公地址',
    10. age int NOT NULL COMMENT '年龄',
    11. login_time timestamp NOT NULL COMMENT '登录时间',
    12. PRIMARY KEY (login_time,customer_idphone_num)
    13. )
    14. DISTRIBUTED BY HASH(customer_id)
    15. PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
    16. COMMENT '客户信息表';

    CUSTOMER表为普通表,customer_id为分布键,login_time为分区键,login_timecustomer_idphone_num为组合主键。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论

-----