本文將介紹使用Sequence過程中的注意事項(xiàng)及問題處理的方法。

限制與注意事項(xiàng)

在使用Sequence時(shí),您需要注意如下事項(xiàng):

  • 轉(zhuǎn)換Sequence類型時(shí),必須指定START WITH起始值。
  • 單元化Group Sequence不支持作為源或目標(biāo)的類型轉(zhuǎn)換,也不支持起始值以外的參數(shù)修改。
  • 屬于同一個(gè)全局唯一數(shù)字序列分配空間的每個(gè)單元化Group Sequence ,必須指定相同的單元數(shù)量和不同的單元索引。
  • PolarDB-X 1.0非拆分模式庫(即后端僅關(guān)聯(lián)一個(gè)已有的RDS物理庫)、或拆分模式庫中僅有單表(即所有表都是單庫單表,且無廣播表)的場(chǎng)景下執(zhí)行INSERT時(shí), PolarDB-X 1.0會(huì)自動(dòng)優(yōu)化并直接下推語句,繞過優(yōu)化器中分配Sequence值的部分。此時(shí)INSERT INTO ... VALUES (seq.nextval, ...)這種用法不支持,建議使用后端RDS/MySQL自增列機(jī)制代替。
  • 如果將指定分庫的Hint用在INSERT語句上,比如INSERT INTO ... VALUES ... 或INSERT INTO ... SELECT ...,且目標(biāo)表使用了Sequence,則PolarDB-X 1.0會(huì)繞過優(yōu)化器直接下推語句,使Sequence不生效,目標(biāo)表最終會(huì)使用后端RDS/MySQL表中的自增機(jī)制生成id。
  • 必須對(duì)同一個(gè)表采用一種統(tǒng)一的方式分配自增id:或者依賴于Sequence,或者依賴于后端RDS/MySQL表的自增列;應(yīng)避免兩種機(jī)制混用,否則很可能會(huì)造成ID沖突(INSERT時(shí)產(chǎn)生重復(fù)ID)的情況,且難于排查。
  • 將Time-based Sequence用于表中自增列時(shí),該列必須使用BIGINT類型。
  • 不建議使用建表時(shí)自動(dòng)關(guān)聯(lián)的、以AUTO_SEQ_為前綴的Group Sequence單獨(dú)獲取NEXTVAL,并使用獲取的值通過INSERT顯式插入該表中,這樣做可能使該Group Sequence頻繁刷新緩存區(qū)間,導(dǎo)致值增長(zhǎng)過快。

如何處理主鍵沖突

如果直接在RDS中寫入了數(shù)據(jù),而對(duì)應(yīng)的主鍵值不是PolarDB-X 1.0生成的Sequence值,那么后續(xù)讓PolarDB-X 1.0自動(dòng)生成主鍵寫入數(shù)據(jù)庫,可能會(huì)和這些數(shù)據(jù)發(fā)生主鍵沖突,您可以通過如下步驟解決此問題:

  1. 通過SHOW SEQUENCES來查看當(dāng)前已有Sequence。AUTO_SEQ_ 開頭的Sequence是隱式Sequence(創(chuàng)建表時(shí)加上AUTO_INCREMENT參數(shù)的字段產(chǎn)生的Sequence)。

    請(qǐng)?jiān)诿钚休斎肴缦麓a:

    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 1.0獲取這個(gè)表最大主鍵值。

    請(qǐng)?jiān)诿钚休斎肴缦麓a:

    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ù)插入語句生成的自增主鍵將不再報(bào)錯(cuò)。

    請(qǐng)?jiān)诿钚休斎肴缦麓a:

    ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;