全部產品
Search
文件中心

PolarDB:使用限制

更新時間:Jul 06, 2024

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

限制與注意事項

在使用Sequence時,您需要注意如下事項:

  • 轉換Sequence類型時,必須指定START WITH起始值。
  • 單元化Group Sequence不支援作為源或目標的類型轉換,也不支援起始值以外的參數修改。
  • 屬於同一個全域唯一數字序列分配空間的每個單元化Group Sequence ,必須指定相同的單元數量和不同的單元索引。
  • PolarDB-X 1.0非拆分模式庫(即後端僅關聯一個已有的RDS物理庫)、或拆分模式庫中僅有單表(即所有表都是單庫單表,且無廣播表)的情境下執行INSERT時, PolarDB-X 1.0會自動最佳化並直接下推語句,繞過最佳化器中分配Sequence值的部分。此時INSERT INTO ... VALUES (seq.nextval, ...)這種用法不支援,建議使用後端RDS/MySQL自增列機制代替。
  • 如果將指定分庫的Hint用在INSERT語句上,比如INSERT INTO ... VALUES ... 或INSERT INTO ... SELECT ...,且目標表使用了Sequence,則PolarDB-X 1.0會繞過最佳化器直接下推語句,使Sequence不生效,目標表最終會使用後端RDS/MySQL表中的自增機制產生id。
  • 必須對同一個表採用一種統一的方式分配自增id:或者依賴於Sequence,或者依賴於後端RDS/MySQL表的自增列;應避免兩種機制混用,否則很可能會造成ID衝突(INSERT時產生重複ID)的情況,且難於排查。
  • 將Time-based Sequence用於表中自增列時,該列必須使用BIGINT類型。
  • 不建議使用建表時自動關聯的、以AUTO_SEQ_為首碼的Group Sequence單獨擷取NEXTVAL,並使用擷取的值通過INSERT顯式插入該表中,這樣做可能使該Group Sequence頻繁重新整理緩衝區間,導致值增長過快。

如何處理主鍵衝突

如果直接在RDS中寫入了資料,而對應的主索引值不是PolarDB-X 1.0產生的Sequence值,那麼後續讓PolarDB-X 1.0自動產生主鍵寫入資料庫,可能會和這些資料發生主鍵衝突,您可以通過如下步驟解決此問題:

  1. 通過SHOW SEQUENCES來查看當前已有Sequence。AUTO_SEQ_ 開頭的Sequence是隱式Sequence(建立表時加上AUTO_INCREMENT參數的欄位產生的Sequence)。

    請在命令列輸入如下代碼:

    SHOW SEQUENCES;

    返回結果如下:

    +---------------------+-------+--------------+------------+-----------+-------+-------+ 
    | 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擷取這個表最大主索引值。

    請在命令列輸入如下代碼:

    SELECT MAX(id) FROM xkv_t_item;

    返回結果如下:

    +-----------+ 
    | MAX(id)   | 
    +-----------+ 
    | 8231      | 
    +-----------+ 
    1 row in set (0.01 sec)
  3. 更新Sequence表中對應的值,這裡更新成比8231要大的值,比如9000,更新完成後,後續插入語句產生的自增主鍵將不再報錯。

    請在命令列輸入如下代碼:

    ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;