mysql 分区错误主键必须包含表分区函数中的所有列

Roh*_*aei 5 mysql partitioning laravel

在 MySQL 8 上我有这个表:

CREATE TABLE `float_values` (
  `id` bigint UNSIGNED NOT NULL,
  `attribute_id` bigint UNSIGNED NOT NULL,
  `value` double(8,2) NOT NULL,
  `created_at` date NOT NULL,
  `updated_at` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `float_values`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `float_values_created_at_unique` (`created_at`);

ALTER TABLE `float_values`
  MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

使用这个架构:

Schema::create('float_values', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->unsignedBigInteger('attribute_id');
            $table->float('value');

            $table->date('created_at');
            $table->date('updated_at');
        });
Run Code Online (Sandbox Code Playgroud)

创建表后,我对created_at列进行了分区:

ALTER TABLE float_values 
PARTITION BY HASH( YEAR(created_at) )
PARTITIONS 4
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

静态分析:

分析过程中发现1个错误。

无法识别的更改操作。(位置 0 处的“”附近)SQL 查询:

更改表 float_values 按哈希分区( YEAR(created_at) ) 分区 4

MySQL 说: 文档

1503 - 主键必须包含表分区函数中的所有列

我知道这个问题是重复的,但答案对我没有帮助!

错误表明我们必须宣布created_at为主键,但我们不能有两个主键我将created_at更改为唯一,但问题仍然存在

Bil*_*win 7

https://dev.mysql.com/doc/refman/8.0/en/partitioning-limitations-partitioning-keys-unique-keys.html说:

分区表的分区表达式中使用的所有列都必须是该表可能具有的每个唯一键的一部分。

换句话说,表上的每个唯一键都必须使用表分区表达式中的每一列。这还包括表的主键,因为根据定义它是唯一键。

对于许多想要在 MySQL 中使用表分区的人来说,这是一个障碍。您不能总是按要分区的列进行分区,因为它要么不在唯一键中,要么表中存在其他唯一(或主)键。

请记住:分区表达式必须是表的每个唯一键的一部分。

即使您要创建created_at唯一键,该表的主键仍然位于该id列上。

如果您同时拥有主键和唯一键,并且这两个键没有公共列,则无法在 MySQL 表上使用分区。

  • 这意味着“id”不再保证其本身是唯一的。您可以有许多具有相同“id”值的行,只要它们具有不同的时间戳即可。这解决了您遇到的分区问题,但这意味着您的表约束作为主键几乎没有用处。 (2认同)