Saya setuju dengan @Aaron Digulla dan @Shane N. Kesenjangan tidak ada artinya. Jika mereka MELAKUKAN berarti sesuatu, itu adalah desain database yang cacat. Titik.
Karena itu, jika Anda benar-benar PERLU mengisi lubang ini, DAN Anda menjalankan setidaknya MySQL 3.23, Anda dapat menggunakan TABEL SEMENTARA untuk membuat satu set ID baru. Idenya di sini adalah bahwa Anda akan memilih semua ID Anda saat ini, secara berurutan, ke dalam tabel sementara seperti:
CREATE TEMPORARY TABLE NewIDs
(
NewID INT UNSIGNED AUTO INCREMENT,
OldID INT UNSIGNED
)
INSERT INTO NewIDs (OldId)
SELECT
Id
FROM
OldTable
ORDER BY
Id ASC
Ini akan memberi Anda tabel yang memetakan ID lama Anda ke ID baru yang akan bersifat berurutan, karena properti AUTO INCREMENT dari kolom NewId.
Setelah ini selesai, Anda perlu memperbarui referensi lain ke Id di "OldTable" dan kunci asing apa pun yang digunakannya. Untuk melakukannya, Anda mungkin perlu MENGHAPUS batasan kunci asing apa pun yang Anda miliki, memperbarui referensi apa pun dalam tabel dari OldId ke NewId, lalu memasang kembali batasan kunci asing Anda.
Namun, saya berpendapat bahwa Anda tidak boleh melakukan APAPUN ini, dan pahami saja bahwa bidang Id Anda ada hanya untuk tujuan referensi catatan, dan seharusnya TIDAK memiliki relevansi tertentu.
UPDATE:Menambahkan contoh memperbarui Id
Misalnya:
Katakanlah Anda memiliki 2 skema tabel berikut:
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)
)
Sekarang, celah muncul di tabel Induk Anda.
Untuk memperbarui nilai Anda di Induk dan Anak, Anda terlebih dahulu membuat tabel sementara dengan pemetaan:
CREATE TEMPORARY TABLE NewIDs
(
Id INT UNSIGNED AUTO INCREMENT,
ParentID INT UNSIGNED
)
INSERT INTO NewIDs (ParentId)
SELECT
ParentId
FROM
Parent
ORDER BY
ParentId ASC
Selanjutnya, kita perlu memberi tahu MySQL untuk mengabaikan batasan kunci asing sehingga kita dapat MEMPERBARUI nilai kita dengan benar. Kami akan menggunakan sintaks ini:
SET foreign_key_checks = 0;
Hal ini menyebabkan MySQL mengabaikan pemeriksaan kunci asing saat memperbarui nilai, tetapi tetap akan menerapkan jenis nilai yang benar yang digunakan (lihat Referensi MySQL untuk rincian).
Selanjutnya, kita perlu memperbarui tabel Induk dan Anak dengan nilai baru. Kami akan menggunakan pernyataan UPDATE berikut untuk ini:
UPDATE
Parent,
Child,
NewIds
SET
Parent.ParentId = NewIds.Id,
Child.ParentId = NewIds.Id
WHERE
Parent.ParentId = NewIds.ParentId AND
Child.ParentId = NewIds.ParentId
Kami sekarang telah memperbarui semua nilai ParentId kami dengan benar ke Id baru yang dipesan dari tabel sementara kami. Setelah ini selesai, kami dapat menerapkan kembali pemeriksaan kunci asing untuk menjaga integritas referensial:
SET foreign_key_checks = 1;
Terakhir, kami akan menghapus tabel sementara untuk membersihkan sumber daya:
DROP TABLE NewIds
Dan itu dia.