Съгласен съм с @Aaron Digulla и @Shane N. Пропуските са безсмислени. Ако тенаправят означава нещо, това е дефектен дизайн на базата данни. Точка.
Като се има предвид това, ако абсолютно ТРЯБВА да запълните тези дупки,И ако използвате поне MySQL 3.23, можете да използвате ВРЕМЕННА ТАБЛИЦА, за да създадете нов набор от идентификатори. Идеята тук е, че ще изберете всичките си текущи идентификационни номера по ред във временна таблица като такава:
CREATE TEMPORARY TABLE NewIDs
(
NewID INT UNSIGNED AUTO INCREMENT,
OldID INT UNSIGNED
)
INSERT INTO NewIDs (OldId)
SELECT
Id
FROM
OldTable
ORDER BY
Id ASC
Това ще ви даде таблица, съпоставяща стария ви идентификатор с чисто нов идентификатор, който ще има последователен характер, поради свойството AUTO INCREMENT на колоната NewId.
След като това е направено, трябва да актуализирате всяка друга препратка към идентификатора в "OldTable" и всеки външен ключ, който използва. За да направите това, вероятно ще трябва да ОТПУСКАТЕ всички ограничения на външния ключ, които имате, да актуализирате всяка препратка в таблици от OldId към NewId и след това да въведете отново ограниченията на външния ключ.
Въпреки това бих казал, че не трябва да правите НИКАКВО от това и просто разберете, че вашето поле за идентификационен номер съществува с единствената цел да препраща към запис и трябва НЕ имат някакво конкретно значение.
АКТУАЛИЗИРАНЕ:Добавяне на пример за актуализиране на идентификаторите
Например:
Да приемем, че имате следните 2 схеми на таблици:
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)
)
Сега пропуските се появяват във вашата родителска таблица.
За да актуализирате стойностите си в родител и дете, първо създавате временна таблица със съпоставянията:
CREATE TEMPORARY TABLE NewIDs
(
Id INT UNSIGNED AUTO INCREMENT,
ParentID INT UNSIGNED
)
INSERT INTO NewIDs (ParentId)
SELECT
ParentId
FROM
Parent
ORDER BY
ParentId ASC
След това трябва да кажем на MySQL да игнорира ограничението на външния ключ, за да можем правилно да АКТУАЛИРАМЕ нашите стойности. Ще използваме този синтаксис:
SET foreign_key_checks = 0;
Това кара MySQL да игнорира проверките на външни ключове при актуализиране на стойностите, но все пак ще наложи използването на правилния тип стойност (вижте Справка за MySQL за детайли).
След това трябва да актуализираме нашите родителски и дъщерни таблици с новите стойности. За това ще използваме следния оператор UPDATE:
UPDATE
Parent,
Child,
NewIds
SET
Parent.ParentId = NewIds.Id,
Child.ParentId = NewIds.Id
WHERE
Parent.ParentId = NewIds.ParentId AND
Child.ParentId = NewIds.ParentId
Сега актуализирахме всички наши стойности на ParentId правилно до новите, подредени идентификатори от нашата временна таблица. След като това приключи, можем да възобновим проверките на външния ключ, за да поддържаме референтната цялост:
SET foreign_key_checks = 1;
Накрая ще премахнем нашата временна таблица, за да почистим ресурсите:
DROP TABLE NewIds
И това е.