本文將介紹自增列的限制與注意事項(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,您可以通過如下步驟解決此問題:

  1. 通過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)
  2. 若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)
  3. 更新Sequence表中對(duì)應(yīng)的值,這里更新成比8231要大的值,例如9000,更新完成后,后續(xù)插入語(yǔ)句生成的自增主鍵將不再報(bào)錯(cuò)。
    ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;