問題の説明
同じ自動インクリメントプライマリキー値 (自動インクリメントID) を使用して、プライマリRDSインスタンスとセカンダリRDSインスタンスのデータをクエリすると、クエリ結果に一貫性がありません。
原因
プライマリキーを含まないテーブルに自動インクリメントのプライマリキーを追加すると、テーブル内でデータレコードがソートされる順序に基づいて、自動インクリメントのプライマリキーの値が割り当てられます。 テーブルにプライマリキーがない場合、テーブル内のデータレコードはストレージエンジンの行IDでソートされます。 テーブル内のデータレコードは、プライマリRDSインスタンスとセカンダリRDSインスタンスで異なる行IDを持つことができ、データレコードは、プライマリRDSインスタンスとセカンダリRDSインスタンスで異なる順序でソートされます。 その結果、同じデータレコードが、プライマリRDSインスタンスとセカンダリRDSインスタンスの自動インクリメントプライマリキーの異なる値に対応します。 詳細については、「バグ #92949」および「MySQLドキュメント」をご参照ください。
ソリューション
問題を解決するには、次の手順を実行します。
プライマリRDSインスタンスで、プライマリキーのない元のテーブルと同じテーブルを作成し、新しいテーブルに自動インクリメントのプライマリキーを追加します。
元のテーブルのデータレコードをフィールドでソートし、ソートされたデータレコードを新しいテーブルに挿入します。
元のテーブルを削除し、新しいテーブルの名前を元のテーブルの名前に変更します。
サンプルコード:
作成テーブルt2のようなt1;
ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARYキー;
t2 SELECTに挿入 * からt1 ORDER BY col1、col2;
ドロップテーブルt1;
名前表t2〜t1;