ホームページ >データベース >mysql チュートリアル >データベース内の自動インクリメントフィールドのギャップを埋める必要がありますか?
自動インクリメント フィールドのギャップの修正: 詳細な説明
自動インクリメント フィールドは、データベース内のレコードの一意の識別子を生成するために使用されます。テーブル。ただし、時間の経過とともに挿入および削除操作が行われるため、これらの識別子のシーケンスにギャップが発生する可能性があります。
ギャップの無意味な性質
注意することが重要です。自動インクリメントフィールドのギャップは通常は意味がありません。これらは論理的な目的を持たないため、データの整理や参照に依存すべきではありません。自動インクリメント フィールドの主な目的は、特定の順序や順序を維持することではなく、各レコードに一意の参照を提供することです。
ギャップを埋める
これらのギャップを埋めるのは直観的であるように思えるかもしれませんが、いくつかの理由から通常は推奨されません:
それでも、必要な場合...
どうしても埋める必要がある場合は、ギャップがある場合は、特定の状況で実行できます。次の手順で詳細な説明を示します。
参照の更新の例
親テーブルと子テーブルがあると仮定します。次のスキーマを使用します:
CREATE TABLE Parent ( ParentId INT UNSIGNED AUTO_INCREMENT, Value INT UNSIGNED, PRIMARY KEY (ParentId) ); CREATE TABLE Child ( ChildId INT UNSIGNED AUTO_INCREMENT, ParentId INT UNSIGNED, PRIMARY KEY (ChildId), FOREIGN KEY (ParentId) REFERENCES Parent (ParentId) );
参照を更新するには、次の手順に従います:
古い親 ID を新しい ID にマッピングする一時テーブルを作成します:
CREATE TEMPORARY TABLE NewIDs ( Id INT UNSIGNED AUTO_INCREMENT, ParentId INT UNSIGNED ); INSERT INTO NewIDs (ParentId) SELECT ParentId FROM Parent ORDER BY ParentId ASC;
外部キーのチェックを無効にする:
SET foreign_key_checks = 0;
新しい ID で親テーブルと子テーブルを更新する:
UPDATE Parent, Child, NewIds SET Parent.ParentId = NewIds.Id, Child.ParentId = NewIds.Id WHERE Parent.ParentId = NewIds.ParentId AND Child.ParentId = NewIds.ParentId;
外部キーチェックを再度有効にします:
SET foreign_key_checks = 1;
一時テーブルを削除します:
DROP TABLE NewIds;
次のようにします手順に従って、親参照と子の参照を更新して、一時テーブルで生成された新しい順序付けされた ID を反映できます。
以上がデータベース内の自動インクリメントフィールドのギャップを埋める必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。