sql >> Databasteknik >  >> RDS >> Mysql

Hur fyller man i hålen i fälten för automatisk ökning?

Jag håller med @Aaron Digulla och @Shane N. Klyftorna är meningslösa. Om de GÖR betyder något, det är en felaktig databasdesign. Period.

Som sagt, om du absolut BEHÖVER att fylla dessa hål, OCH om du kör minst MySQL 3.23 kan du använda en TILLFÄLLIG TABELL för att skapa en ny uppsättning ID:n. Tanken här är att du ska välja alla dina nuvarande ID:n, i ordning, i en tillfällig tabell som sådan:

CREATE TEMPORARY TABLE NewIDs
(
    NewID INT UNSIGNED AUTO INCREMENT,
    OldID INT UNSIGNED
)

INSERT INTO NewIDs (OldId)
SELECT
    Id
FROM
    OldTable
ORDER BY
    Id ASC

Detta kommer att ge dig en tabell som mappar ditt gamla ID till ett helt nytt ID som kommer att vara sekventiellt till sin natur, på grund av AUTO INCREMENT-egenskapen i NewId-kolumnen.

När detta är gjort måste du uppdatera alla andra referenser till ID:t i "OldTable" och eventuell främmande nyckel som den använder. För att göra detta måste du antagligen SLAPPA alla begränsningar för främmande nyckel du har, uppdatera eventuella referenser i tabeller från OldId till NewId och sedan återställa dina främmande nyckelbegränsningar.

Däremot skulle jag hävda att du inte ska göra NÅGON av detta, och bara förstå att ditt ID-fält finns endast i syfte att referera till en post, och bör INTE har någon specifik relevans.

UPPDATERING:Lägger till ett exempel på uppdatering av Id:n

Till exempel:

Låt oss säga att du har följande två tabellscheman:

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)
)

Nu visas luckorna i din överordnade tabell.

För att uppdatera dina värden i Parent and Child skapar du först en tillfällig tabell med mappningarna:

CREATE TEMPORARY TABLE NewIDs
(
    Id INT UNSIGNED AUTO INCREMENT,
    ParentID INT UNSIGNED
)

INSERT INTO NewIDs (ParentId)
SELECT
    ParentId
FROM
    Parent
ORDER BY
    ParentId ASC

Därefter måste vi berätta för MySQL att ignorera den främmande nyckelbegränsningen så att vi korrekt kan UPPDATERA våra värden. Vi kommer att använda denna syntax:

SET foreign_key_checks = 0;

Detta gör att MySQL ignorerar kontroller av främmande nyckel vid uppdatering av värdena, men det kommer fortfarande att upprätthålla att korrekt värdetyp används (se MySQL-referens för detaljer).

Därefter måste vi uppdatera våra överordnade och barn-tabeller med de nya värdena. Vi kommer att använda följande UPDATE-sats för detta:

UPDATE
    Parent,
    Child,
    NewIds
SET
    Parent.ParentId = NewIds.Id,
    Child.ParentId = NewIds.Id
WHERE
    Parent.ParentId = NewIds.ParentId AND
    Child.ParentId = NewIds.ParentId

Vi har nu uppdaterat alla våra ParentId-värden korrekt till de nya, beställda Id:n från vår tillfälliga tabell. När detta är klart kan vi återinföra våra utländska nyckelkontroller för att upprätthålla referensintegritet:

SET foreign_key_checks = 1;

Slutligen kommer vi att släppa vår tillfälliga tabell för att rensa upp resurser:

DROP TABLE NewIds

Och det är det.



  1. Hur man beräknar median i MySQL

  2. Åtgärda Drop Column Bug i Oracle 18c och 19c

  3. Stöder SQL Server CLR Integration konfigurationsfiler?

  4. SQLite FINNS