Zgadzam się z @Aaron Digulla i @Shane N. Luki są bez znaczenia. Jeśli ROZDZIE coś znaczy, to jest wadliwy projekt bazy danych. Okres.
Biorąc to pod uwagę, jeśli absolutnie POTRZEBUJESZ wypełnić te dziury, ORAZ używasz co najmniej MySQL 3.23, możesz użyć TABELI TYMCZASOWEJ do utworzenia nowego zestawu identyfikatorów. Pomysł polega na tym, że zamierzasz wybrać wszystkie swoje obecne identyfikatory, po kolei, do tabeli tymczasowej jako takiej:
CREATE TEMPORARY TABLE NewIDs
(
NewID INT UNSIGNED AUTO INCREMENT,
OldID INT UNSIGNED
)
INSERT INTO NewIDs (OldId)
SELECT
Id
FROM
OldTable
ORDER BY
Id ASC
To da ci tabelę mapującą twój stary identyfikator na zupełnie nowy identyfikator, który będzie z natury sekwencyjny, ze względu na właściwość AUTO INCREMENT kolumny NewId.
Gdy to zrobisz, musisz zaktualizować wszelkie inne odniesienia do identyfikatora w „OldTable” i dowolny klucz obcy, którego używa. Aby to zrobić, prawdopodobnie będziesz musiał usunąć wszystkie ograniczenia klucza obcego, które masz, zaktualizować wszelkie odniesienia w tabelach ze starego identyfikatora do nowego identyfikatora, a następnie ponownie wprowadzić ograniczenia klucza obcego.
Twierdzę jednak, że nie powinieneś robić ŻADNEJ tego i po prostu zrozum, że Twoje pole identyfikatora istnieje wyłącznie w celu odwoływania się do rekordu i NIE mają jakieś szczególne znaczenie.
AKTUALIZACJA:dodanie przykładu aktualizowania identyfikatorów
Na przykład:
Załóżmy, że masz następujące 2 schematy tabel:
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)
)
Teraz luki pojawiają się w Twojej tabeli nadrzędnej.
Aby zaktualizować swoje wartości w polach Rodzic i Dziecko, najpierw utwórz tabelę tymczasową z mapowaniami:
CREATE TEMPORARY TABLE NewIDs
(
Id INT UNSIGNED AUTO INCREMENT,
ParentID INT UNSIGNED
)
INSERT INTO NewIDs (ParentId)
SELECT
ParentId
FROM
Parent
ORDER BY
ParentId ASC
Następnie musimy powiedzieć MySQL, aby zignorował ograniczenie klucza obcego, abyśmy mogli poprawnie UAKTUALNIĆ nasze wartości. Użyjemy tej składni:
SET foreign_key_checks = 0;
Powoduje to, że MySQL ignoruje sprawdzanie kluczy obcych podczas aktualizowania wartości, ale nadal wymusza użycie prawidłowego typu wartości (patrz Informacje o MySQL dla szczegółów).
Następnie musimy zaktualizować nasze tabele Parent i Child o nowe wartości. W tym celu użyjemy następującej instrukcji UPDATE:
UPDATE
Parent,
Child,
NewIds
SET
Parent.ParentId = NewIds.Id,
Child.ParentId = NewIds.Id
WHERE
Parent.ParentId = NewIds.ParentId AND
Child.ParentId = NewIds.ParentId
Teraz poprawnie zaktualizowaliśmy wszystkie nasze wartości ParentId do nowych, uporządkowanych identyfikatorów z naszej tabeli tymczasowej. Po zakończeniu możemy ponownie wprowadzić nasze kontrole kluczy obcych, aby zachować integralność referencyjną:
SET foreign_key_checks = 1;
Na koniec usuniemy naszą tabelę tymczasową, aby wyczyścić zasoby:
DROP TABLE NewIds
I to jest to.