Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да попълним дупките в полетата за автоматично увеличение?

Съгласен съм с @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

И това е.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Docker-compose проверява дали mysql връзката е готова

  2. Импортирайте данни в MySQL база данни

  3. MySQL 'Поръчай по' - правилно сортиране на букви и цифри

  4. PERIOD_ADD() Примери – MySQL

  5. Импортиране, експортиране на mysql база данни супербърз команден ред