注意
仅V5.1.20.0.13及以后版本的实例,支持使用本文介绍的DDL语句。
语法
CREATE TABLE [IF NOT EXISTS] table_name
(create_definition, ...)
[table_option]
{ [partition_option] | [sharding_hint] }
create_definition:
column_name column_definition
| {INDEX | KEY} [index_name] [index_type] (key_part, ...)
| ...
table_option: {
[ENGINE [=] engine_name]
| [CHARACTER SET [=] charset_name]
| [COLLATE [=] collation_name]
}
partition_option: {
GLOBAL
| SINGLE [DN [=] ‘dn_name’]
| UDAL_PARTITION BY {
HASH(column_name) [udal_partition_option]
| HASH_STRING(column_name) [udal_partition_option]
| RANGE(column_name) RANGE_VALUES = ‘value1[,value2...]’
} [DN [=] ‘dn_name[,dn_name...]’]
udal_partition_option: {
PARTITIONS [=] number
| BUCKETS [=] number
}
sharding_hint:
/* sharding @@table name=’table_name’ set type =’sharding_type’
[and {
dn=’dn_name[,dn_name...]’
| sharding_algo=’sharding_algo’
| sharding_id=’column_name1’
| sharding_area=’column_name2’
| buckets=’number’
| range_values=’value1,value2...’
| map_file=’enum_value1:index1,enum_value2:index2,...’
| default_node=’node’
| start_date=’start_date’
| time_unit_type=’time_unit_type’
| time_unit_len=’time_unit_len’
| inner_sharding_id=’column_name’
| inner_sharding_algo=’sharding_algo’
| inner_total=’number’
| inner_map_file=’enum_value1:index1,enum_value2:index2,...’
| inner_default_node=’node’
| inner_start_date=’start_date’
| inner_time_unit_type=’time_unit_type’
| inner_time_unit_len=’time_unit_len’
}] */
sharding_algo: {
mod
| string-mod
| file-map
| date-range
| enum-mod
| enum-string-mod
| PartitionByIntRange
}
sharding_type: {
global
| single
| inner
| sharding
}参数说明
table_name:待创建的数据表名称。column_name:指定数据列名称。column_definition:指定数据列定义,可包括类型、能否为空、默认值等属性。index_name:指定索引名称。index_type:指定索引类型。key_part:指定组成索引的数据列。engine_name:指定要使用的存储引擎,常用的引擎有innodb等。charset_name:指定数据库的字符集。支持设置为utf8和utf8mb4字符集。collation_name:指定数据库的排序规则。支持设置为utf8_general_ci和utf8mb4_bin排序规则。
其中:
partition_option以SQL风格写法来指定分库分表信息,sharding_hint以HINT风格来指定分库分表信息,两者虽然写法不同,但作用相同。在简单使用场景可以使用SQL风格分片写法或HINT风格分片写法任意一种,而由于HINT风格分片写法支持更多的分库分表算法,功能更强大一些,如在复杂使用场景只能用HINT风格分片写法。
partition_option和sharding_hint支持的分库分表算法存在差异,详情如下:说明
更多算法信息,请参见分片算法。
分库分表算法
partition_optionsharding_hint(整数)取模(PartitionByMod)
支持(关键字HASH)
支持
字符串hashCode取模(PartitionByStringMod)
支持(关键字HASH_STRING)
支持
枚举(PartitionByFileMap)
不支持
支持
时间范围(PartitionByDateRange)
不支持
支持
枚举分组取模分片(PartitionByEnumAndMod)
不支持
支持
枚举分组字符串hashCode取模分片(PartitionByEnumAndStringMod)
不支持
支持
数值范围(PartitionByIntRange)
支持(关键字RANGE) 支持
partition_option语法:参数说明
GLOBAL:用于创建全局表。SINGLE:用于创建单片表,且只能为单个逻辑库创建单个物理表。DN: 用于指定待使用的RDS ,对于单片表只能使用一个RDS。仅当逻辑数据库只包含一个RDS时可省略此参数,将会使用已绑定的唯一RDS。
UDAL_PARTITION BY:用于创建分片(分库)表。仅支持整数取模(PartitionByMod)、字符串hashCode取模(PartitionByStringMod)和数值范围(PartitionByIntRange)三种算法。HASH(column_name):用于指定分片算法为整数取模(PartitionByMod),column_name指定用于计算分片的数据列,此处只允许单个列。HASH_STRING(column_name): 用于指定分片算法为字符串hashCode取模(PartitionByStringMod),column_name指定用于计算分片的数据列,这里只允许单个列。RANGE(column_name):用于指定分片算法为数值范围(PartitionByIntRange),column_name指定用于计算分片的数据列,这里只允许单个列。RANGE_VALUES:用于指定数值范围分片算法的各个范围值,只允许int值。且数量必须与DN数量保持一致。DN:用于指定要使用的RDS,默认值为当前逻辑数据库包含的所有RDS。PARTITIONS:用于指定分表的数量,默认值为1。当省略时,将使用默认值。BUCKETS:用于指定分桶的数量,无默认值,必须显式指定。
建表语句说明
分片表从类型上来说主要分成3类,分别为库内分表、库内分桶、既不分表也不分桶。本文将按照分片表类型来简单为您介绍建表语句。
库内分表
既分库(分片)也分表,通过在
UDAL_PARTITION BY指定两次分片算法来依次指定分库算法和分表算法,主要语法格式为:UDAL_PARTITION BY 算法1(column1), 算法2(column2)此处的算法是指上文介绍的
HASH或HASH_STRING。另外可搭配PARTITIONS参数来指定分表数量,搭配DN参数指定待使用的RDS列表。库内分桶
既分库(分片)也分桶,由于分桶是通过虚拟分片来实现,因此只需要指定一次分片算法即可,主要语法格式为:
UDAL_PARTITION BY 算法(column)此处的算法是指上文介绍的
HASH或HASH_STRING。注意,必须添加BUCKETS参数来指定分桶数量,也可搭配DN参数指定待使用的RDS列表。既不分表也不分桶
对应只分库的情况,只需指定一次分片算法,主要语法格式为:
UDAL_PARTITION BY 算法(column)由于不需要分表或分桶,因此无需使用
PARTITIONS或BUCKETS参数,但可搭配DN参数指定待使用的RDS列表。
sharding_hint语法:@@table name=’{table_name}’:指定数据表名称。type:指定表的类型。支持的类型及对应的关键字如下:
全局表:global
单片表:single
分库分表:inner
库内分桶或既不分表也不分库:sharding
dn:指定要使用的RDS列表。对于单片表只能使用一个RDS。当忽略此项时默认使用当前逻辑数据库包含的所有RDS。sharding_algo:指定分片算法。注意
该参数必须与
sharding_id搭配使用。sharding_id:指定用于计算分片的数据列。注意
该参数必须与
sharding_algo搭配一起使用。buckets:指定分桶数量,合法取值范围为[1, 128]。注意
当创建库内分桶(分库分桶)类型的数据表时必须指定此项。
sharding_area: 用于枚举分组取模分片(PartitionByEnumAndMod)和枚举分组字符串hashCode取模分片(PartitionByEnumAndStringMod)算法,指定分组列。使用这两种算法时必须指定此项。range_values:用于指定数值范围(PartitionByIntRange)分片算法的各个范围值。map_file: 用于分片的枚举算法中指定各个枚举值对应的分片序号,枚举算法包括枚举(PartitionByFileMap)、枚举分组取模分片(PartitionByEnumAndMod)和枚举分组字符串hashCode取模分片(PartitionByEnumAndStringMod)。default_node:用于分片的枚举算法中指定默认节点,枚举算法包括枚举(PartitionByFileMap)、枚举分组取模分片(PartitionByEnumAndMod)和枚举分组字符串hashCode取模分片(PartitionByEnumAndStringMod)。start_date:用于分片的时间范围(PartitionByDateRange)算法中指定开始日期。time_unit_type:用于分片的时间范围(PartitionByDateRange)算法中指定时间单元类型,支持设置为day、 week,、month和year。time_unit_len:用于分片的时间范围(PartitionByDateRange)算法中指定时间单元值。inner_sharding_algo:指定分表算法。注意
该参数必须与
inner_sharding_id搭配一起使用。inner_sharding_id:指定用于计算分表的数据列。注意
该参数必须与
inner_sharding_algo搭配一起使用。inner_total:指定分表数量。注意
当创建分库分表类型的数据表时必须指定此项。
inner_map_file:用于分表的枚举算法中指定各个枚举值对应的分片序号,枚举算法包括枚举(PartitionByFileMap)、枚举分组取模分片(PartitionByEnumAndMod)和枚举分组字符串hashCode取模分片(PartitionByEnumAndStringMod)。inner_default_node:用于分表的枚举算法中指定默认节点,枚举算法包括枚举(PartitionByFileMap)、枚举分组取模分片(PartitionByEnumAndMod)和枚举分组字符串hashCode取模分片(PartitionByEnumAndStringMod)。inner_start_date:用于分表的时间范围(PartitionByDateRange)算法中指定开始日期。inner_time_unit_type:用于分表的时间范围(PartitionByDateRange)算法中指定时间单元类型,支持设置为day、 week,、month和year。inner_time_unit_len:用于分表的时间范围(PartitionByDateRange)算法中指定时间单元值。
语法示例
示例1:
在一个已经创建好的数据库中,使用如下HINT风格的SQL语句可建立一个名为my_table的全局表:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/* sharding @@table name='my_table' set type='global' */;使用如下SQL风格的写法可达到等同效果:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
GLOBAL;示例2:
在一个已经创建好的数据库中,使用如下HINT风格的SQL语句可建立一个单片表,其中,通过dn参数指定了单片表分布在名为dn1的RDS上。
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/* sharding @@table name='my_table' set type='single' and dn='dn1' */;使用如下SQL风格的写法可达到等同效果:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SINGLE DN 'dn1';示例3:
在一个已经创建好的数据库中,使用如下HINT风格的SQL语句可建立一个库内分表(分库分表)的数据表,其中,在sharding hint中通过sharding_algo、sharding_id指定了分片算法和算法作用的数据列,inner_sharding_id、inner_sharding_algo则指定了分表算法和算法作用的数据列,并通过inner_total指定了分片数量为10,通过dn指定了使用的RDS为dn1、dn2和dn3。
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
`column1` int NOT NULL,
`column2` int NOT NULL,
`column3` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/* sharding @@table name='my_table' set type='inner'
and sharding_algo='PartitionByMod'
and sharding_id='column1'
and inner_sharding_id='column2'
and inner_sharding_algo='PartitionByMod'
and inner_total=10
and dn='dn1,dn2,dn3' */;使用如下SQL风格的写法可达到等同效果:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
`column1` int NOT NULL,
`column2` int NOT NULL,
`column3` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
UDAL_PARTITION BY HASH(column1), HASH(column2)
PARTITIONS 10
DN 'dn1,dn2,dn3';示例4:
在一个已经创建好的数据库中,使用如下HINT风格的SQL语句可建立一个库内分桶(分库分桶)的数据表,其中,在sharding hint中通过sharding_algo、sharding_id指定了分片算法和算法作用的数据列,并通过buckets指定了分桶数量为10,通过dn指定了使用的RDS为dn1、dn2和dn3。
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
`column1` int NOT NULL,
`column2` int NOT NULL,
`column3` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/* sharding @@table name='bill' set type='sharding'
and sharding_algo='PartitionByMod'
and sharding_id='column1'
and buckets=10
and dn='dn1,dn2,dn3' */;使用如下SQL风格的写法可达到等同效果:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
`column1` int NOT NULL,
`column2` int NOT NULL,
`column3` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
UDAL_PARTITION BY HASH(column1)
BUCKETS 10
DN 'dn1,dn2,dn3';示例5:
在一个已经创建好的数据库中,使用如下HINT风格的SQL语句可建立一个只分片、既不分表也不分桶的数据表,其中,在sharding hint中通过sharding_algo、sharding_id指定了分片算法和算法作用的数据列,并通过dn指定了使用的RDS为dn1、dn2和dn3。
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
`column1` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/* sharding @@table name='my_table' set type='sharding'
and sharding_id='column1'
and sharding_algo='PartitionByMod'
and dn='dn1,dn2,dn3' */;使用如下SQL风格的写法可达到等同效果:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int NOT NULL,
`column1` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
UDAL_PARTITION HASH(column1)
DN 'dn1,dn2,dn3';