开发者社区 > 数据库 > 关系型数据库 > 正文

PolarDB 这个分区创建报错 建议如何更改 是改主键还是?

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 ;

展开
收起
三分钟热度的鱼 2024-03-20 17:37:40 17 0
2 条回答
写回答
取消 提交回答
  • 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_idid 之间存在逻辑上的关联,并且它们组合确实是唯一的,则上述修改是可行的。如果不符合这一条件,则需重新考虑分区策略或者主键的设计。

    2024-03-29 09:04:58
    赞同 1 展开评论 打赏
  • 这个是mysql的限制, 主键/唯一键必须包含分区键,主键改成 PRIMARY KEY (idmedia_id )可以。此回答整理自钉群“PolarDB专家面对面 - 大表&分区表& 冷温热数据管理& XEngine高压缩引擎功能”

    2024-03-20 20:02:03
    赞同 1 展开评论 打赏

相关产品

  • 云原生数据库 PolarDB
  • 相关电子书

    更多
    云栖大会:开源 PolarDB 架构演进、关键技术与社区建设 立即下载
    2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
    2023云栖大会:PolarDB for AI 立即下载