MySQL - 分区所需的主键

Tal*_*boY 2 mysql

我需要每天根据UTC时间戳对我的表进行分区,我得到错误 Fatal error: A PRIMARY KEY must include all columns in the table's partitioning function

我这样做,列id是INT PRIMARY KEY列date是INT存储UTC时间戳

我的桌子结构 DESCRIBE stats;

Field   Type    Null    Key     Default     Extra   
id      int(11) NO      PRI     NULL    auto_increment
date    int(11) YES             NULL    
.
.
.
.
Run Code Online (Sandbox Code Playgroud)

创建表结构 SHOW CREATE TABLE stats

CREATE TABLE `stats` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `date` int(11) DEFAULT NULL,
 .
 .
 .
 .
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=371 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)

我通过php执行脚本

$today = strtotime("today midnight");
$partition = date('d_m_y',$today); 

ALTER TABLE `stats`
PARTITION BY RANGE (date) (
PARTITION p_$partition VALUES LESS THAN ($today)
)
Run Code Online (Sandbox Code Playgroud)

我试过这个,但得到语法错误

ALTER TABLE `stats`
UNIQUE KEY (`id`)
PARTITION BY RANGE (date) (
PARTITION p_$partition VALUES LESS THAN ($today)
)

ALTER TABLE `stats`
PRIMARY KEY (`id`)
PARTITION BY RANGE (date) (
PARTITION p_$partition VALUES LESS THAN ($today)
)

ALTER TABLE `stats`
PRIMARY KEY (`id`,`date`)
PARTITION BY RANGE (date) (
PARTITION p_$partition VALUES LESS THAN ($today)
)
Run Code Online (Sandbox Code Playgroud)

也试过HASH但同样的错误A PRIMARY KEY must include all columns in the table's partitioning function in

ALTER TABLE stats
PARTITION BY HASH(date)
PARTITIONS 1
Run Code Online (Sandbox Code Playgroud)

也试过这种方式,但得到了错误 Fatal error: Partition management on a not partitioned table is not possible

ALTER TABLE `stats` 
ADD PARTITION (
PARTITION p_$partition VALUES LESS THAN ($today)
)
Run Code Online (Sandbox Code Playgroud)

请参阅并建议任何可能的方法来执行此操作.

谢谢

Tal*_*boY 5

我通过添加date主键解决了这个问题id.

ALTER TABLE `stats` DROP PRIMARY KEY, ADD PRIMARY KEY(`id`,`date`);
Run Code Online (Sandbox Code Playgroud)

现在表已成功分区.

希望它也能帮助别人.

谢谢