自動インクリメント フィールドのギャップに対処する
自動インクリメント フィールドの目的は、データベース内のレコードを一意に識別することだけです。削除されたレコードによって生じたギャップを埋めることが望ましいように思えるかもしれませんが、一般的にそうすることはデータベースの悪い慣行とみなされます。
ギャップ埋め戦略の欠陥
試みギャップを埋めると、次のような問題が発生する可能性があります:
-
データベースの欠陥設計: 自動インクリメント ID には、レコード識別子としての使用を超えた特定の関連性があることを暗示します。
-
データ操作エラー: 意図せずにデータを変更したり、不一致が生じたりします。
代替案考慮事項
ギャップを埋めるのではなく、次の代替案を検討してください:
-
将来のギャップを予約します: ID シーケンスの最後に十分に大きなギャップを追加します。将来の削除の可能性に対応するため。
-
ギャップを文書化します: を提供します。ギャップがある場合は、ギャップの意味を説明するドキュメント。
-
不必要な削除を避ける: 可能であれば、自動インクリメント フィールドを持つテーブルからレコードを削除しないようにします。
MySQL でのギャップ埋めの強制(上級)
どうしても必要な場合、MySQL のギャップを埋めるには高度な手順が必要です:
-
一時テーブルを作成します: CREATE TEMPORARY TABLE NewIDs(新しいID INT UNSIGNED AUTO_INCREMENT、OldID INT UNSIGNED).
-
一時テーブルにデータを追加します: INSERT INTO NewIDs (OldId) SELECT Id FROM OldTable ORDER BY Id ASC.
-
親テーブルと子テーブルを更新します。 親、子、NewIds セットを更新しますParent.ParentId = NewIds.Id、Child.ParentId = NewIds.Id WHERE Parent.ParentId = NewIds.ParentId AND Child.ParentId = NewIds.ParentId.
-
外部キー チェックを再度有効にします: 外部キーチェックを設定 = 1.
-
一時テーブルを削除します: DROP TABLE NewIds.
ただし、このアプローチには固有のリスクがあるため、慎重に検討することを強くお勧めします。 .
以上が自動インクリメントフィールドのギャップを埋める必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。