mysql1526错误_mysql 分区 1526错误

参考:https://bugs.mysql.com/bug.php?id=52815

简而言之就是你建的表分区最大值不够用了

bdcde22447e56d2a905202aad6308824.png

如果表有主键,那么主键必须包含分区键,分区键是主键的子集。这个应该算是局限了。

这个是正确的

CREATE TABLE IF NOT EXISTS `test_hash_part41` (

`id` int(11) NOT NULL ,

`pid` int(11) NOT NULL ,

`comment` varchar(1000) NOT NULL DEFAULT '' ,

`ip` varchar(25) NOT NULL DEFAULT '' ,

PRIMARY KEY (`id`,pid)

) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

PARTITION BY KEY(id)

PARTITIONS 3;

下面这个会ERROR 1503(HY000):A PRIMARY KEY must include all columns inthe table's partitioning function

CREATE TABLE IF NOT EXISTS `test_hash_part42` (

`id` int(11) NOT NULL ,

`pid` int(11) NOT NULL ,

`comment` varchar(1000) NOT NULL DEFAULT '' ,

`ip` varchar(25) NOT NULL DEFAULT '' ,

PRIMARY KEY (`id`)

) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

PARTITION BY KEY(id,pid)

PARTITIONS 3;

分区的sql语法

partition_options:

PARTITION BY

{ [LINEAR] HASH(expr)

| [LINEAR] KEY(column_list)

| RANGE(expr)

| LIST(expr) }

[PARTITIONS num]

[SUBPARTITION BY

{ [LINEAR] HASH(expr)

| [LINEAR] KEY(column_list) }

[SUBPARTITIONS num]

]

[(partition_definition [, partition_definition] ...)]

partition_definition:

PARTITION partition_name

[VALUES {LESS THAN {(expr) | MAXVALUE} | IN (value_list)}]

[[STORAGE] ENGINE [=] engine_name]

[COMMENT [=] 'comment_text' ]

[DATA DIRECTORY [=] 'data_dir']

[INDEX DIRECTORY [=] 'index_dir']

[MAX_ROWS [=] max_number_of_rows]

[MIN_ROWS [=] min_number_of_rows]

[TABLESPACE [=] tablespace_name]

[NODEGROUP [=] node_group_id]

[(subpartition_definition [, subpartition_definition] ...)]

subpartition_definition:

SUBPARTITION logical_name

[[STORAGE] ENGINE [=] engine_name]

[COMMENT [=] 'comment_text' ]

[DATA DIRECTORY [=] 'data_dir']

[INDEX DIRECTORY [=] 'index_dir']

[MAX_ROWS [=] max_number_of_rows]

[MIN_ROWS [=] min_number_of_rows]

[TABLESPACE [=] tablespace_name]

[NODEGROUP [=] node_group_id]

例子:

创建range分区

CREATE TABLE `testpartition` (

`id` int(11) NOT NULL AUTO_INCREMENT ,

`name` varchar(50) NOT NULL ,

`sex` int(1) NOT NULL DEFAULT '0' ,

PRIMARY KEY (`id`)

) ENGINE=Innodb DEFAULT CHARSET=utf8

PARTITION BY RANGE (id) (

PARTITION p0 VALUES LESS THAN (3),

PARTITION p1 VALUES LESS THAN (6),

PARTITION p2 VALUES LESS THAN (9),

PARTITION p3 VALUES LESS THAN (12),

PARTITION p4 VALUES LESS THAN MAXVALUE

);

插入数据

INSERT INTO testpartition (`name` ,`sex`)VALUES ('jhh', '0')

,('zhang',1),('ying',1),('aaaa',1),('bbbb',0),('test1',1),('jhh2',1)

,('jhh1',1),('test2',1),('test3',1),('test4',1),('test5',1),('jhh3',1)

,('jhh4',1),('jhh5',1),('jhh6',1),('jhh7',1),('jhh8',1),('jhh9',1)

,('jhh10',1),('jhh11',1),('jhh12',1),('jhh13',1),('jhh21',1),('jhh42',1);

可以drop 某个分区alter table drop partition p4 ;

如果是删除了最大的分区p4,导致比较大的数值没有相应的分区,会报如下类似错误的。ERROR1526(HY000):Tablehasnopartitionforvalue.

改变分区,相当于重整分区了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL分区是一种将大型表水平分成多个部分的技术,这有助于提高查询和数据管理的效率。在 MySQL 中,可以使用 RANGE、LIST、HASH 和 KEY 四种分区类型来定义分区方式。 下面是 MySQL分区的详细操作步骤: 1. 创建表时定义分区方式 在创建表的时候,可以指定表的分区方式。例如,使用 RANGE 分区方式将表按照数值范围进行分区: ``` CREATE TABLE mytable ( id INT, value INT ) PARTITION BY RANGE (value) ( PARTITION p0 VALUES LESS THAN (10), PARTITION p1 VALUES LESS THAN (20), PARTITION p2 VALUES LESS THAN (MAXVALUE) ); ``` 2. 插入数据 向表中插入数据时,MySQL 会自动将数据插入到正确的分区中。例如,插入一个 value 值为 5 的数据: ``` INSERT INTO mytable (id, value) VALUES (1, 5); ``` 3. 查询数据 在查询数据时,MySQL 可以仅查询特定的分区,而不必扫描整个表。例如,查询 value 值在 10 到 20 之间的数据: ``` SELECT * FROM mytable PARTITION (p1); ``` 4. 修改分区 可以使用 ALTER TABLE 语句修改表的分区方式,例如,将表从 RANGE 分区方式修改为 HASH 分区方式: ``` ALTER TABLE mytable PARTITION BY HASH(value) PARTITIONS 4; ``` 5. 合并分区 可以使用 ALTER TABLE 语句将相邻的分区合并为一个分区,例如,将分区 p1 和 p2 合并为一个分区: ``` ALTER TABLE mytable COALESCE PARTITION p1, p2 INTO p3; ``` 6. 删除分区 可以使用 ALTER TABLE 语句删除表的某个分区,例如,删除分区 p0: ``` ALTER TABLE mytable DROP PARTITION p0; ``` 以上就是 MySQL分区的详细操作步骤,可以根据实际需求选择不同的分区方式来提高查询和数据管理的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值