开发指南—DDL语句—分区表语法—CREATE TABLE

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 本文主要介绍使用DDL语句进行建表的语法、子句、参数和基本方式

本文主要介绍使用DDL语句进行建表的语法、子句、参数和基本方式。

语法


CREATE [PARTITION] TABLE [IF NOT EXISTS] tbl_name
    (create_definition, ...)
    [table_options]
    [table_partition_definition]
create_definition:
    col_name column_definition
  | mysql_create_definition
  | [UNIQUE] GLOBAL INDEX index_name [index_type] (index_sharding_col_name,...)
      [global_secondary_index_option]
      [index_option] ...
index_sharding_col_name:
    col_name [(length)] [ASC | DESC]
index_option:
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
index_type:
    USING {BTREE | HASH}
# 全局二级索引相关
global_secondary_index_option:
    [COVERING (col_name,...)]
    [partition_options]
# 分区表类型定义
table_partition_definition:
        single
  | broadcast
  | partition_options
# 分区策略定义
partition_options:
    PARTITION BY
          HASH({column_name | partition_func(column_name)})
        | KEY(column_list)
        | RANGE{({column_name | partition_func(column_name)}) 
        | RANGE COLUMNS(column_list)}
        | LIST{({column_name | partition_func(column_name)}) 
        | LIST COLUMNS(column_list)} }
    partition_list_spec
# 分区函数定义
partition_func:
    YEAR
  | TO_DAYS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH
# 分区列表定义
partition_list_spec:
        hash_partition_list
  | range_partition_list
  | list_partition_list
# Hash / Key 分区表列定义
hash_partition_list:
    PARTITIONS partition_count
# Range / Range Columns 分区表列定义
range_partition_list:
    range_partition [, range_partition ...]
range_partition:
    PARTITION partition_name VALUES LESS THAN {(expr | value_list)} [partition_spec_options]
    
# List / List Columns 分区表列定义
list_partition_list:
    list_partition [, list_partition ...]
list_partition:
    PARTITION partition_name VALUES IN (value_list) [partition_spec_options]
partition_spec_options:
          [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string']
        [{CHARSET | CHARACTER SET} [=] charset]
        [COLLATE [=] collation]
        [TABLEGROUP [=] table_group_id]
        [LOCALITY [=] locality_option]
locality_option:
    'dn=storage_inst_id_list'
    
storage_inst_id_list:
    storage_inst_id[,storage_inst_id_list]


说明 PolarDB-X DDL语法基于MySQL语法,以上主要列出了差异部分,详细语法请参见MySQL 文档

默认自动分区

  • 建表SQL在不指定分区键的情况下,PolarDB-X默认会按主键(如果表没有指定主键,则使用隐式主键)并使用KEY分区策略进行分区,默认分区的分区数目是64。
  • 用户也可以通过指定CREATE PARTITION TABLE语法关键字进行建表,来显示让PolarDB-X选择主键进行自动分区,示例如下:
CREATE PARTITION TABLE auto_part_tbl(

id bigint not null auto_increment,
bid int,
name varchar(30),
primary key(id)
);

单表与广播表

PolarDB-X允许创建表时通过指定关键字SINGLE来建单表(不进行任何分区的表),示例如下:


CREATE TABLE single_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
primary key(id)
) SINGLE;

PolarDB-X允许创建表时通过指定关键字BROADCAST来建广播表(该表将在所有DN节点上有一份数据完全相同的拷贝),示例如下:


CREATE TABLE broadcast_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
primary key(id)
) BROADCAST;

分区表

PolarDB-X允许创建表时通过指定分区子句的语义,来创建符合业务需要求的分区表。从总体上,PolarDB-X支持三种类型的分区策略:

  • Hash分区策略:基于用户指定的分区列或分区函数表达式的值,使用内置的一致性哈希算法计算其哈希值并进行分区路由的策略。按是否支持使用分区函数表达式或使用多个分区列作为分区键,Hash分区策略又可以进行步细分为Hash分区与Key分区两种类型。
  • Range分区策略:基于用户指定的分区列或分区函数表达式的值,通过比较计算来确定其所落在哪些预定义分区的范围并进行分区路由的策略。按是否支持使用分区函数表达式或使用多个分区列作为分区键,Range分区策略又可以进行步细分为Range分区与Range Columns分区两种类型。
  • List分区策略:与Range分区策略类似,基于用户指定的分区列或分区函数表达式的值,通过比较计算来确定其所落在哪些预指定义分区的取值集合并进行分区路由的策略。按是否支持使用分区函数表达式或使用多个分区列作为分区键,List 分区策略又可以进行步细分为List分区与List Columns分区两种类型。

Hash分区策略

PolarDB-X按是否支持使用分区函数表达式或使用多个分区列作为分区键,Hash分区策略进行步细分为Hash分区与Key分区两种类型。

  • Hash分区Hash分区建表只支持使用一个整数类型的分区列作为分区健,但对于时间类型的分区列,它支持这些分区列外层套用一个分区函数表达式(例如,YEAR/TO_DAYS/TO_SECOND/MONTH等)来转换成整数类型。其次需要值得注意的是,Hash分区是不支持直接使用字符串类型作为分区列。如果想要按照用户ID列进行分区,预建的Hash分区数目是8,可以执行以下命令建表:
CREATE TABLE hash_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
partition by hash(bid)
partitions 8;
  • 如果想要按找用户出生日期birthday列进行分区,预建的Hash分区数目是8,可以执行以下命令建表:
CREATE TABLE hash_tbl_todays(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY HASH(TO_DAYS(birthday))
PARTITIONS 8;
  • 目前,PolarDB-X的分区函数仅支持以下列表:
    • YEAR
    • TO_DAYS
    • TO_SECOND
    • MONTH
    • UNIX_TIMESTAMP
  • Key分区与Hash分区不同,使用Key分区建表,支持同时使用多个分区列作为分区键,但它不允许分区列外层套用任何分区函数表达。Key分区的分区列的类型支持比Hash分区更为丰富,支持的类型如下所示:
    • 整数类型:BIGINT/BIGINT UNSINGEDINT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED
    • 时间类型:DATETIME/DATE/TIMESTAMP
    • 字符串类型:CHAR/VARCHR
  • 因此,Key分区是PolarDB-X的默认分区策略。
    如果想要按照用户ID列与用户出生日期列作为分区键进行分区,预建的Hash分区数目是8,可以执行以下命令建表:
CREATE TABLE key_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(id, birthday)
PARTITIONS 8;

Range分区策略

PolarDB-X按照是否支持使用分区函数表达式或使用多个分区列作为分区键,将Range分区策略进一步细分为Range分区与Range Columns分区两种类型。

  • Range分区Range分区只支持使用一个整数类型的分区列作为分区健,但对于时间类型的分区列,它支持这些分区列外层套用一个分区函数表达式(例如,YEAR/TO_DAYS/TO_SECOND/MONTH等)来转换成整数类型。另外值得注意的是,Range分区是不支持直接使用字符串类型作为分区列。

    说明 Range不支持使用NULL值作为边界值。
    如果业务想按订单的日期进行Range分区,并且每个季度一个分区,可以执行以下命令建表:
CREATE TABLE orders(
id int,
order_time datetime not null)
PARTITION BY RANGE(to_days(order_time))
(
PARTITION p1 VALUES LESS THAN (to_days('2021-01-01')),
PARTITION p2 VALUES LESS THAN (to_days('2021-04-01')),
PARTITION p3 VALUES LESS THAN (to_days('2021-07-01')),
PARTITION p4 VALUES LESS THAN (to_days('2021-10-01')),
PARTITION p5 VALUES LESS THAN (to_days('2022-01-01'))
);
  • Range Columns分区Range Columns分区支持同时使用多个分区列作为分区键,但它不允许分区列外层套用任何分区函数表达。Range Columns分区的分区列的类型支持比Range分区更为丰富,支持的类型如下所示:
    • 整数类型:BIGINT/BIGINT UNSINGEDINT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED
    • 时间类型:DATETIME/DATE
    • 字符串类型:CHAR/VARCHR
  • 说明
    • Range Columns分区目前还不支的使用TIMESTAMP类型,后续版本会完善。
    • 不支持使用NULL值作为边界值。
  • 如果业务想要按照订单ID与订单日期进行Range分区, 可以执行以下命令建表:
CREATE TABLE orders(
order_id int,
order_time datetime not null)
PARTITION BY range columns(order_id,order_time)
(
PARTITION p1 VALUES LESS THAN (10000,'2021-01-01'),
PARTITION p2 VALUES LESS THAN (20000,'2021-01-01'),
PARTITION p3 VALUES LESS THAN (30000,'2021-01-01'),
PARTITION p4 VALUES LESS THAN (40000,'2021-01-01'),
PARTITION p5 VALUES LESS THAN (50000,'2021-01-01')
);

List分区策略

与Range分区类似,PolarDB-X按是否支持使用分区函数表达式或使用多个分区列作为分区键,将List分区策略进一步细分为List分区与List Columns分区两种类型。

  • List分区List分区只支持使用一个整数类型的分区列作为分区健,但对于时间类型的分区列,它支持这些分区列外层套用一个分区函数表达式(例如,YEAR/TO_DAYS/TO_SECOND/MONTH等)来转换成整数类型。另外值得注意的是,Range分区是不支持直接使用字符串类型作为分区列。
    如果业务想按订单的日期进行List分区,并且每个季度一个分区,可以执行以下命令建表:
CREATE TABLE orders(
id int,
order_region varchar(64),
order_time datetime not null)
PARTITION BY LIST(YEAR(order_time))
(
PARTITION p1 VALUES IN (1990,1991,1992,1993,1994,1995,1996,1997,1998,1999),
PARTITION p2 VALUES IN (2000,2001,2002,2003,2004,2005,2006,2007,2008,2009),
PARTITION p3 VALUES IN (2010,2011,2012,2013,2014,2015,2016,2017,2018,2019)
);
  • List Columns分区List Columns分区支持同时使用多个分区列作为分区键,但它不允许分区列外层套用任何分区函数表达。List Columns分区的分区列的类型支持比List分区更为丰富,支持的类型如下所示:
    • 整数类型:BIGINT/BIGINT UNSINGEDINT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED
    • 时间类型:DATETIME/DATE
    • 字符串类型:CHAR/VARCHR
  • 说明
    • List Columns分区目前还不支的使用TIMESTAMP类型,后续版本进行完善。
    • 不支持使用NULL值作为边界值。
  • 如果业务按照订单ID与订单日期进行Range分区,可以执行以下命令建表:
CREATE TABLE orders(
id int,
order_region varchar(64),
order_time datetime not null)
PARTITION BY LIST COLUMNS(order_region)
(
PARTITION p1 VALUES IN ('Hangzhou', 'Shenzhen'),
PARTITION p2 VALUES IN ('Beijing', 'Shanghai'),
PARTITION p3 VALUES IN ('Qingdao')
);

分区表数据类型

各种分区策略及其数据类型支持如下:

数据类型 Hash类型(HASH) Hash类型(KEY) Range类型(Range) Range类型(Range Columns) List类型(List) List类型(List Columns)
数值类型 TINYINT image支持 image支持 image支持 image支持 image支持 image支持
TINYINT UNSIGNED image支持 image支持 image支持 image支持 image支持 image支持
SMALLINT image支持 image支持 image支持 image支持 image支持 image支持
SMALLINT UNSIGNED image支持 image支持 image支持 image支持 image支持 image支持
MEDIUMINT image支持 image支持 image支持 image支持 image支持 image支持
MEDIUMINT UNSIGNED image支持 image支持 image支持 image支持 image支持 image支持
INT image支持 image支持 image支持 image支持 image支持 image支持
INT UNSIGNED image支持 image支持 image支持 image支持 image支持 image支持
BIGINT image支持 image支持 image支持 image支持 image支持 image支持
BIGINT UNSIGNED image支持 image支持 image支持 image支持 image支持 image支持
时间类型 DATE image分区列需要套用year/month/to_days/to_seconds函数。 image支持 image分区列需要套用year/month/to_days/to_seconds函数。 image支持 image分区列需要套用year/month/to_days/to_seconds函数。 image支持
DATETIME image分区列需要套用year/month/to_days/to_seconds函数。 image支持 image分区列需要套用year/month/to_days/to_seconds函数。 image支持 image分区列需要套用year/month/to_days/to_seconds函数。 image支持
TIMESTAMP image分区列必须要外套unix_timestamp函数配合使用。 image支持 image暂不支持 image暂不支持 image暂不支持 image暂不支持
字符串类型 CHAR image不支持 image支持 image不支持 image支持 image不支持 image支持
VARCHAR image不支持 image支持 image不支持 image支持 image不支持 image支持

参数说明

参数 说明
CHARSET | CHARACTER SET 指定表中列的默认字符集,可使用字符集如下:
  • utf8
  • utf8mb4
  • gbk
COLLATE 指定表中列的默认字符序,可使用字符序如下:
  • utf8_bin
  • utf8_general_ci
  • utf8_unicode_ci
  • gbk_bin
  • gbk_chinese_ci
  • utf8mb4_general_ci
  • utf8mb4__general_cs
  • utf8mb4_bin
  • utf8mb4_unicode_ci
TABLEGROUP 用于指定分区表所属于的表组。若不指定,会自动查找或创建与之分区方式完全一致的表组。
LOCALITY 用于指定分区表的所在DN节点。
相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
SQL 算法 关系型数据库
开发指南—DDL语句—分区表语法—CREATE TABLE
本文主要介绍使用DDL语句进行建表的语法、子句、参数和基本方式
129 0
|
SQL 关系型数据库 MySQL
开发指南—DDL语句—分区表语法—DROP TABLE
您可以使用DROP TABLE语法删除指定表。
100 0
|
SQL 数据库
开发指南—DDL语句—分区表语法—CREATE TABLEGROUP
CREATE TABLEGROUP语句用于在数据库中创建一个表组。
108 0
|
SQL 关系型数据库 MySQL
开发指南—DDL语句—分区表语法—ALTER TABLE
您可以通过ALTER TABLE语法改变表的结构,如增加列、增加索引、修改数据定义等
201 0
|
4天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
20天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
24天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
15天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
11549 10
|
9天前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
4008 13
|
16天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
6690 10
下一篇
无影云桌面