PolarDB 这个分区创建报错 A PRIMARY KEY must include all columns in the table's partitioning function 建议如何更改 是改主键还是?
CREATE TABLE oc_media_metadata
(
id
bigint unsigned NOT NULL DEFAULT 0,
media_id
char(26) NOT NULL COMMENT 'Media ID',
suffix
char(1) NOT NULL COMMENT 'Media Suffix',
mimetype_id
smallint unsigned NOT NULL DEFAULT '0' COMMENT 'MIME type ID',
size
bigint unsigned NOT NULL DEFAULT '0' COMMENT 'File size (bytes)',
width
int unsigned NOT NULL DEFAULT '0' COMMENT 'Width for image/video files',
height
int unsigned NOT NULL DEFAULT '0' COMMENT 'Height for image/video files',
crc32c
int unsigned NOT NULL DEFAULT '0' COMMENT 'File crc32c checksum (secret field)',
sub_updated_at
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Subtable update timestamp',
PRIMARY KEY (id
),
KEY idx_mediaid
(media_id
),
UNIQUE KEY uni_mediaid_suffix
(media_id
, suffix
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Media Metadata'
PARTITION BY KEY (media_id
)
PARTITIONS 128 ;
PolarDB 在创建分区表时遇到错误“A PRIMARY KEY must include all columns in the table's partitioning function”,这意味着如果您使用某个字段作为分区键(在这个例子中是 media_id
),那么这个字段必须包含在主键中。
针对您给出的 oc_media_metadata
表的创建语句,您需要修改主键定义,使其包含分区键 media_id
。由于您的分区是基于 media_id
进行的,因此应该将 media_id
添加到主键中,例如:
CREATE TABLE oc_media_metadata (
id bigint unsigned NOT NULL DEFAULT 0,
media_id char(26) NOT NULL COMMENT 'Media ID',
suffix char(1) NOT NULL COMMENT 'Media Suffix',
mimetype_id smallint unsigned NOT NULL DEFAULT '0' COMMENT 'MIME type ID',
size bigint unsigned NOT NULL DEFAULT '0' COMMENT 'File size (bytes)',
width int unsigned NOT NULL DEFAULT '0' COMMENT 'Width for image/video files',
height int unsigned NOT NULL DEFAULT '0' COMMENT 'Height for image/video files',
crc32c int unsigned NOT NULL DEFAULT '0' COMMENT 'File crc32c checksum (secret field)',
sub_updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Subtable update timestamp',
PRIMARY KEY (id, media_id), -- 修改这里,将 media_id 添加到主键中
UNIQUE KEY idx_mediaid (media_id),
UNIQUE KEY uni_mediaid_suffix (media_id, suffix)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Media Metadata'
PARTITION BY KEY (media_id)
PARTITIONS 128 ;
不过需要注意的是,这可能导致原本单字段主键变成复合主键,且在业务逻辑上可能需要调整以确保 (id, media_id)
组合的唯一性。另外,由于 id
字段已经是 NOT NULL
并且默认为 0
,通常情况下它被用作唯一标识符,所以在实际应用中是否适合将 media_id
加入主键取决于具体业务场景和数据模型的设计。如果 media_id
和 id
之间存在逻辑上的关联,并且它们组合确实是唯一的,则上述修改是可行的。如果不符合这一条件,则需重新考虑分区策略或者主键的设计。
这个是mysql的限制, 主键/唯一键必须包含分区键,主键改成 PRIMARY KEY (id
,media_id
)可以。此回答整理自钉群“PolarDB专家面对面 - 大表&分区表& 冷温热数据管理& XEngine高压缩引擎功能”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云关系型数据库主要有以下几种:RDS MySQL版、RDS PostgreSQL 版、RDS SQL Server 版、PolarDB MySQL版、PolarDB PostgreSQL 版、PolarDB分布式版 。