本文將介紹自增列的限制與注意事項(xiàng),以及處理主鍵沖突的方法。
限制與注意事項(xiàng)
- 在AUTO模式數(shù)據(jù)庫(kù)中,僅支持關(guān)聯(lián)New Sequence;
- 在DRDS模式庫(kù)中,單表默認(rèn)不關(guān)聯(lián)Sequence,除非顯式指定類型;
- 新創(chuàng)建的表不包含主鍵時(shí),PolarDB-X會(huì)自動(dòng)通過
AUTO_INCREMENT
關(guān)鍵字創(chuàng)建隱式主鍵,并關(guān)聯(lián)Group Sequence; - 當(dāng)自增列關(guān)聯(lián)的Sequence類型為TIME時(shí),該列類型必須為BIGINT;
- 如果
INSERT
語(yǔ)句中包含指定分庫(kù)的Hint,例如INSERT INTO ... VALUES ...
或INSERT INTO ... SELECT ...
,并且目標(biāo)表帶有自增列,則PolarDB-X會(huì)繞過優(yōu)化器直接下推語(yǔ)句,使與自增列關(guān)聯(lián)的Sequence不生效,目標(biāo)表最終會(huì)通過數(shù)據(jù)節(jié)點(diǎn)物理分表上的自增列屬性填充值; - 支持通過
ALTER SEQUENCE
來(lái)添加、刪除自增列或變更自增列的值; - PolarDB-X中Sequence暫不支持自定義步長(zhǎng),因此auto_increment_increment始終為1,而auto_increment_offset則不支持;
- New Sequence中使用GMS對(duì)AUTO_INCREMENT的值進(jìn)行分配,為保證性能,需要在GMS內(nèi)緩存一段值。如果GMS發(fā)生版本升級(jí)、主備切換、變配、遷移等操作,那么操作前內(nèi)存中緩存的值會(huì)被丟棄,造成值的跳躍。
如何處理主鍵沖突
如果因?yàn)橐恍┨厥鈭?chǎng)景導(dǎo)致了主鍵沖突,例如通過Hint下推導(dǎo)致物理分片分配ID后,Sequence無(wú)法感知到而分配了沖突的ID,您可以通過如下步驟解決此問題:
- 通過
SHOW SEQUENCES
來(lái)查看當(dāng)前已有Sequence。AUTO_SEQ_ 開頭的Sequence是隱式Sequence(創(chuàng)建表時(shí)通過AUTO_INCREMENT關(guān)鍵字產(chǎn)生的Sequence)。SHOW SEQUENCES;
返回結(jié)果如下:
+---------------------+-------+--------------+------------+-----------+-------+-------+ | NAME | VALUE | INCREMENT_BY | START_WITH | MAX_VALUE | CYCLE | TYPE | +---------------------+-------+--------------+------------+-----------+-------+-------+ | AUTO_SEQ_xkv_t_item | 0 | N/A | N/A | N/A | N/A | GROUP | | AUTO_SEQ_xkv_shard | 0 | N/A | N/A | N/A | N/A | GROUP | +---------------------+-------+--------------+------------+-----------+-------+-------+ 2 rows in set (0.04 sec)
- 若xkv_t_item表有沖突,并且xkv_t_item表主鍵是ID,那么從PolarDB-X獲取這個(gè)表最大主鍵值。
SELECT MAX(id) FROM xkv_t_item;
返回結(jié)果如下:
+-----------+ | MAX(id) | +-----------+ | 8231 | +-----------+ 1 row in set (0.01 sec)
- 更新Sequence表中對(duì)應(yīng)的值,這里更新成比8231要大的值,例如9000,更新完成后,后續(xù)插入語(yǔ)句生成的自增主鍵將不再報(bào)錯(cuò)。
ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;