このトピックでは、シーケンスの制限とプライマリキーの競合のトラブルシューティング方法について説明します。
制限と使用に関する注意事項
シーケンスを使用する場合は、次の項目に注意してください。
- シーケンスをあるタイプから別のタイプに変換するときは、START WITHパラメーターを指定する必要があります。
- 複数のユニットを含むGROUPシーケンスは、別のタイプのシーケンスに変換することはできず、他のタイプのシーケンスは、複数のユニットを含むGROUPシーケンスに変換することはできない。 複数の単位を含むGROUPシーケンスのSTART WITHパラメーターの値のみを変更できます。 シーケンスを定義するために使用される他のパラメーターの値は変更できません。
- 同じGROUPシーケンスに属するユニットシーケンスの定義では、unit COUNTパラメータの値は同じでなければならず、INDEXパラメータの値は異なる必要があります。
- INSERTステートメントが、非シャードPolarDB-X 1.0データベース、または非シャードテーブルのみがありブロードキャストテーブルがないシャードデータベースで実行された場合、PolarDB-X 1.0は自動的にステートメントを最適化して送信します。 この方法では、シーケンス値を割り当てるためにオプティマイザを使用する必要はありません。 この場合、
INSERT INTO... VALUES (seq.nextval, ...)
文はサポートされていません。 代わりに、ApsaraDB RDSが提供する自動インクリメント列機能を使用することを推奨します。 - データベースシャードを指定するために使用されるヒントが、INSERT INTO... などのINSERTステートメントに含まれている場合 価値... またはINSERT INTO... INSERTステートメントが実行されるターゲットテーブルがシーケンスを使用する場合、PolarDB-X 1.0はオプティマイザをバイパスし、実行されるステートメントを直接送信します。 この場合、シーケンスは有効にならず、ApsaraDB RDSに格納されているテーブルの自動インクリメント列を使用してターゲットテーブルにIDが生成されます。
- ApsaraDB RDSが提供するシーケンスまたは自動インクリメント機能を使用して、自動インクリメントIDを生成できます。 同じテーブルに自動インクリメントIDを生成するには、必ず同じ方法を使用してください。 両方のメソッドを同じテーブルで使用すると、識別が困難な重複IDが生成されます。
- 時間ベース (time) シーケンスを使用してテーブルの自動インクリメント列の値を生成する場合は、列のデータ型がBIGINTである必要があります。
- NEXTVALを取得し、
insert
を使用して取得した値を明示的な値としてテーブルに挿入するために、テーブルの作成時に自動的にテーブルに関連付けられるAUTO_SEQ_
というプレフィックスが付いたGROUPシーケンスを使用しないことをお勧めします。 そうすると、GROUPシーケンスが頻繁にキャッシュを更新し、値が速くなりすぎる可能性があります。
プライマリキーの競合のトラブルシューティング
データレコードがApsaraDB RDSに直接書き込まれ、対応するプライマリキー値がPolarDB-X 1.0によって生成されたシーケンス値でない場合、PolarDB-X 1.0によって自動的に生成されるプライマリキー値は、データレコードに対応するプライマリキー値と競合する可能性があります。 この問題を解決するには、次の手順を実行します。
SHOW SEQUENCES
ステートメントを実行して、既存のシーケンスを照会します。 名前がAUTO_SEQ_でプレフィックスされているシーケンスは、暗黙のシーケンスです。 暗黙的なシーケンスを作成するには、テーブルを作成するために実行されるステートメントでAUTO_INCREMENTパラメーターを指定する必要があります。CLIで次のステートメントを実行します。
ショーシーケンス;
次の結果が返されます。
+ --------------------- ----------------------------------------------------------------------- | 名前 | 値 | 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秒)
- PolarDB-X 1.0テーブルの主キー列の既存の最大値を照会します。 この例では、xkv_t_itemテーブルのプライマリキー列はidで、テーブルには重複するプライマリキー値が含まれています。 次のステートメントを実行して、id列の既存の最大値を照会できます。
CLIで次のステートメントを実行します。
SELECT MAX(id) FROM xkv_t_item;
次の結果が返されます。
+ ---------- | MAX(id) | + ---------- | 8231 | + ---------- 1行セット (0.01秒)
- テーブルの最大シーケンス値を9000など、8231を超える値に変更します。 値が変更された後、INSERTステートメントを実行したときに生成される自動インクリメント主キーについてはエラーは返されません。
CLIで次のステートメントを実行します。
ALTERシーケンスAUTO_SEQ_xkv_t_item START WITH 9000;