すべてのプロダクト
Search
ドキュメントセンター

PolarDB:制限事項

最終更新日:Jun 05, 2024

このトピックでは、自動インクリメント列を使用する前に注意する必要がある制限と注意事項について説明します。 このトピックでは、重複する主キー値が生成されるときの問題のトラブルシューティング方法についても説明します。

制限と注意事項

  • データベースがAUTOモードの場合、テーブルの自動インクリメント列はNEWシーケンスのみに関連付けることができます。
  • データベースがDRDSモードの場合、パーティション分割されていないテーブルはシーケンスに関連付けられません。 パーティション分割されていないテーブルをシーケンスに関連付ける場合は、テーブルのシーケンスを指定する必要があります。
  • テーブルの作成時にテーブルのプライマリキーを指定しない場合、PolarDB-XAUTO_INCREMENTキーワードを使用して暗黙のプライマリキーを自動的に作成します。 PolarDB-XもGROUPシーケンスを作成し、GROUPシーケンスを暗黙の主キーに関連付けます。
  • テーブルの自動インクリメント列がTIMEシーケンスに関連付けられている場合、自動インクリメント列のデータ型はBIGINTでなければなりません。
  • INSERTステートメントに、INSERT INTO... などのデータベースシャードを指定するために使用されるヒントが含まれている場合 価値... またはINSERT INTO... SELECT... 、ターゲットテーブルに自動インクリメント列が含まれている場合、PolarDB-Xはステートメントを最適化せず、ステートメントを実行のためにデータノード層にプッシュダウンします。 その結果、自動インクリメント列に関連付けられたシーケンスの構成は有効になりません。 この場合、PolarDB-Xは、データノードの物理テーブルシャードの自動インクリメント列の値を、ターゲットテーブルの自動インクリメント列の値として使用します。
  • ALTER SEQUENCEステートメントを使用して、自動インクリメント列を追加または削除したり、自動インクリメント列の値を変更したりできます。
  • PolarDB-Xは、シーケンスのカスタムステップサイズをサポートしていません。 auto_increment_increment変数の値は1で、auto_increment_offset変数はサポートされていません。
  • Newシーケンスでは、グローバルメタサービス (GMS) を使用してAUTO_INCREMENTの値を割り当てます。 パフォーマンスが期待どおりになるようにするには、GMSで値をキャッシュする必要があります。 GMSがアップグレード、切り替え、構成変更、移行などの操作を実行する場合、メモリにキャッシュされている値は、操作が実行される前に破棄されます。 結果として、値は無効である。

重複する主キー値の問題のトラブルシューティング

特定のシナリオでは、重複主キー値が生成され得る。 たとえば、ID列はテーブルの主キー列として使用されます。 ヒントを含むSQLステートメントが実行のためにデータノード層にプッシュダウンされると、物理テーブルシャードはID列の値を生成します。 この場合、テーブルに関連付けられているシーケンスは、物理テーブルシャードによって生成された値を取得できません。 その結果、シーケンスはID列の重複値を生成します。 この問題を解決するには、次の手順を実行します。

  1. SHOW SEQUENCESステートメントを実行して、既存のシーケンスを照会します。 名前にAUTO_SEQ_プレフィックスが含まれるシーケンスは暗黙のシーケンスです。 暗黙的なシーケンスは、テーブルの作成時に自動インクリメント列に基づいて自動的に作成されるシーケンスです。
    ショーシーケンス;

    サンプル結果:

    + --------------------- -----------------------------------------------------------------------
    | 名前 | 値 | INCREMENT_BY | START_WITH | MAX_VALUE | サイクル | タイプ |
    + --------------------- + ------------------------------------------------------------------------
    | AUTO_SEQ_xkv_t_item | 0 | N/A | N/A | N/A | N/A | グループ |
    | AUTO_SEQ_xkv_shard | 0 | N/A | N/A | N/A | N/A | グループ |
    + --------------------- + ------------------------------------------------------------------------
    セットの2列 (0.04秒) 
  2. PolarDB-Xテーブルのプライマリキー列の既存の最大値を照会します。 この例では、xkv_t_itemテーブルのプライマリキー列はidで、テーブルには重複するプライマリキー値が含まれています。 次のステートメントを実行して、id列の既存の最大値を照会できます。
    SELECT MAX(id) FROM xkv_t_item;

    サンプル結果:

    + ----------
    | MAX(id) |
    + ----------
    | 8231 |
    + ----------
    1行セット (0.01秒) 
  3. シーケンスの開始値を、プライマリキーの既存の最大値よりも大きい値に変更します。 この例では、主キーの既存の最大値は8231です。 シーケンスの開始値を9000に変更できます。 シーケンスの開始値が変更された後、シーケンスは9000以上の後続の値を生成します。 この方法では、新しいステートメントを実行してデータを挿入するときに、シーケンスは重複した主キー値を生成しません。
    ALTERシーケンスAUTO_SEQ_xkv_t_item START WITH 9000;