我有这种形式的插入查询:
on INSERT into abc values .... on DUPLICATE KEY UPDATE ....
在我没有分区的原始表中,唯一键在(subject_id, object_id)
上,但现在我按ts
进行分区,由于mysql要求,我被迫将唯一键设为(subject_id, object_id, ts)
在所有唯一键中使用分区键。
这意味着我的插入查询将失败,因为插入具有相同的subject_id和object_id(来自某些先前的插入),但不同的时间戳将被视为唯一的新行,并且将插入而不是所需的更新。
有解决方法吗?
CREATE TABLE `abc` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`subject_id` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
`object_id` varchar(36) COLLATE utf8_unicode_ci NOT NULL,
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`ts`),
UNIQUE KEY `userint_sub_type_obj` (`subject_id`,`object_id`, `ts`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
/*!50100 PARTITION BY RANGE (unix_timestamp(ts))
(PARTITION p2012_08_27 VALUES LESS THAN (1346025600) ENGINE = InnoDB,
PARTITION p2012_08_28 VALUES LESS THAN (1346112000) ENGINE = InnoDB,
PARTITION p2012_08_29 VALUES LESS THAN (1346198400) ENGINE = InnoDB,
PARTITION p2012_08_30 VALUES LESS THAN (1346284800) ENGINE = InnoDB,
PARTITION p2012_08_31 VALUES LESS THAN (1346371200) ENGINE = InnoDB) */
答案 0 :(得分:2)
简而言之,我没有办法在不将分区键作为所有唯一键(因此也是主键)的一部分的情况下添加分区。
http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html
我上周试图在启用/禁用列上删除分区时遇到同样的问题。我想到了两种解决方案。
毋庸置疑,我发现这种分区限制在后方是一个巨大的痛苦,但它确实似乎是一个限制在MySQL和一些谷歌和周围问,似乎有简单的方式。