この形式の挿入クエリがあります:
on INSERT into abc values .... on DUPLICATE KEY UPDATE ....
パーティションのない元のテーブルでは、一意のキーがオンでした(subject_id, object_id)
が、現在はパーティションを作成しており、すべての一意のキーにパーティションキーを含めるというmysqlの要件のためts
、一意のキーを使用する必要があります。(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) */