MYSQL的分区字段,必须包含在主键字段内。
存在问题,如果按照create_time日期建立索引, 需要在唯一索引里面也要包含这个字段. 因为create_time会变,会导致唯一索引失效.
如果是在程序中做唯一验证,在并发情况下,会导致唯一索引失效.
- 建分区表SQL示例如下, 使用create_time作为分区字段.
use test ;
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(128) NOT NULL COMMENT 'name',
`type` varchar(128) NOT NULL COMMENT 'type',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create_time',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'update_time',
PRIMARY KEY (`id`, `create_time`),
UNIQUE KEY `uk_user_nt_un` (`name`, `type`, `create_time`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE ( UNIX_TIMESTAMP(`create_time`) ) (
PARTITION p20220101 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-01-01 00:00:00') ),
PARTITION p20220201 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-02-01 00:00:00') ),
PARTITION p20220301 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-03-01 00:00:00') ),
PARTITION p20220401 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-04-01 00:00:00') ),
PARTITION p20220501 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-05-01 00:00:00') ),
PARTITION p20220601 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-06-01 00:00:00') ),
PARTITION p20220701 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-07-01 00:00:00') ),
PARTITION p20220801 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-08-01 00:00:00') ),
PARTITION p20220901 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-09-01 00:00:00') ),
PARTITION p20221001 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-10-01 00:00:00') ),
PARTITION p20221101 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-11-01 00:00:00') ),
PARTITION p20221201 VALUES LESS THAN ( UNIX_TIMESTAMP('2022-12-01 00:00:00') ),
PARTITION p20230101 VALUES LESS THAN ( UNIX_TIMESTAMP('2023-01-01 00:00:00') )
);
- 验证 唯一约束失效…