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

ApsaraDB RDS:ApsaraDB RDSインスタンスのテーブルに自動インクリメントプライマリキーを追加すると、プライマリRDSインスタンスのクエリ結果とセカンダリRDSインスタンスのクエリ結果が一致しません。 どうすればよいですか。

最終更新日:Jan 23, 2024

問題の説明

同じ自動インクリメントプライマリキー値 (自動インクリメントID) を使用して、プライマリRDSインスタンスとセカンダリRDSインスタンスのデータをクエリすると、クエリ結果に一貫性がありません。

原因

プライマリキーを含まないテーブルに自動インクリメントのプライマリキーを追加すると、テーブル内でデータレコードがソートされる順序に基づいて、自動インクリメントのプライマリキーの値が割り当てられます。 テーブルにプライマリキーがない場合、テーブル内のデータレコードはストレージエンジンの行IDでソートされます。 テーブル内のデータレコードは、プライマリRDSインスタンスとセカンダリRDSインスタンスで異なる行IDを持つことができ、データレコードは、プライマリRDSインスタンスとセカンダリRDSインスタンスで異なる順序でソートされます。 その結果、同じデータレコードが、プライマリRDSインスタンスとセカンダリRDSインスタンスの自動インクリメントプライマリキーの異なる値に対応します。 詳細については、「バグ #92949」および「MySQLドキュメント」をご参照ください。

ソリューション

問題を解決するには、次の手順を実行します。

  1. プライマリRDSインスタンスで、プライマリキーのない元のテーブルと同じテーブルを作成し、新しいテーブルに自動インクリメントのプライマリキーを追加します。

  2. 元のテーブルのデータレコードをフィールドでソートし、ソートされたデータレコードを新しいテーブルに挿入します。

  3. 元のテーブルを削除し、新しいテーブルの名前を元のテーブルの名前に変更します。

サンプルコード:

作成テーブルt2のようなt1;
ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARYキー;
t2 SELECTに挿入 * からt1 ORDER BY col1、col2;
ドロップテーブルt1;
名前表t2〜t1;