本文將介紹使用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自動生成主鍵寫入數據庫,可能會和這些數據發生主鍵沖突,您可以通過如下步驟解決此問題:
- 通過
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)
- 若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)
- 更新Sequence表中對應的值,這里更新成比8231要大的值,比如9000,更新完成后,后續插入語句生成的自增主鍵將不再報錯。
請在命令行輸入如下代碼:
ALTER SEQUENCE AUTO_SEQ_xkv_t_item START WITH 9000;