【问题标题】:MySQL - A UNIQUE INDEX must include all columns in the table's partitioning functionMySQL - 唯一索引必须包括表分区函数中的所有列
【发布时间】:2017-02-03 17:10:52
【问题描述】:

我有以下表格设置(示例中简化了列名):

CREATE TABLE data_2016
( `a` INTEGER , 
  `b` INTEGER,
  `c` VARCHAR(255),
  `d` BIGINT,
  `e` VARCHAR(255) NOT NULL,
  `f` INTEGER ,
  `g` BIGINT ,
  `h` BIGINT ,
  `i` SERIAL,
PRIMARY KEY (`d`,`i`),
UNIQUE KEY(`b`, `c`, `d`, `e`, `f`,`g`,`h`,`i`),
INDEX `idx1` (`b`,`c`)
)
PARTITION BY RANGE (`d`) (
PARTITION p1 VALUES LESS THAN (...)
...
PARTITION px VALUES LESS THAN (MAXVALUE)
)

但我收到了异常A UNIQUE INDEX must include all columns in the table's partitioning function

我通读了文档,据我所知,我确实有正确的设置。分区列d 包含在PRIMARY KEYUNIQUE KEY 定义中。我在这里做错了什么?

【问题讨论】:

  • 我认为这种情况下的唯一索引是指主键,而不是唯一键。
  • @GordonLinoff 但分区列在两者中
  • 。 . i 列。
  • @GordonLinoff i 列呢?我没有对它进行分区。是说我需要将其包含在分区中吗?
  • 你希望通过PARTITIONing获得什么?它很少提供任何性能优势。 (由于混淆,我无法猜测答案。)

标签: mysql sql indexing database-partitioning


【解决方案1】:

SERIAL 更改为INT UNSIGNED AUTO_INCREMENT(或任何等效项)。 manual 说:

SERIAL 是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名。

这意味着有一个隐含的

UNIQUE(i)

其中不包括分区键d

需要CHARACTER SET latin1 以避免另一个关于索引长度的错误。 (对于索引而言,8 列通常“太长”。)

(看看我的cmets。)

【讨论】:

  • 是的,就是这样!谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2017-12-08
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多