sql >> Databáze >  >> RDS >> Mysql

Jak vyplnit díry v polích automatického přírůstku?

Souhlasím s @Aaron Digulla a @Shane N. Mezery jsou nesmyslné. Pokud DĚLAJÍ něco znamená, to je chybný návrh databáze. Období.

Jak již bylo řečeno, pokud tyto díry absolutně POTŘEBUJETE vyplnit, A používáte alespoň MySQL 3.23, můžete použít TEMPORARY TABLE k vytvoření nové sady ID. Myšlenka je taková, že vyberete všechna svá aktuální ID v pořadí do dočasné tabulky jako takové:

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

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

Získáte tak tabulku mapující vaše staré ID na zcela nové ID, které bude sekvenční povahy, díky vlastnosti AUTO INCREMENT sloupce NewId.

Jakmile to uděláte, musíte aktualizovat jakýkoli další odkaz na ID v „OldTable“ a jakýkoli cizí klíč, který používá. Chcete-li to provést, budete pravděpodobně muset ZRUŠIT všechna omezení cizího klíče, která máte, aktualizovat všechny odkazy v tabulkách z OldId na NewId a poté znovu zavést vaše omezení cizího klíče.

Řekl bych však, že byste neměli dělat ŽÁDNÉ a uvědomte si, že vaše pole ID existuje pouze pro účely odkazování na záznam a NEMělo mají nějakou konkrétní relevanci.

AKTUALIZACE:Přidání příkladu aktualizace ID

Například:

Řekněme, že máte následující 2 schémata tabulek:

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

Nyní se ve vaší nadřazené tabulce objevují mezery.

Chcete-li aktualizovat své hodnoty v Parent and Child, nejprve vytvořte dočasnou tabulku s mapováním:

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ále musíme říci MySQL, aby ignorovalo omezení cizího klíče, abychom mohli správně AKTUALIZOVAT naše hodnoty. Použijeme tuto syntaxi:

SET foreign_key_checks = 0;

To způsobí, že MySQL bude při aktualizaci hodnot ignorovat kontroly cizích klíčů, ale bude stále vynucovat použití správného typu hodnoty (viz Reference MySQL pro detaily).

Dále musíme aktualizovat naše rodičovské a podřízené tabulky novými hodnotami. K tomu použijeme následující příkaz UPDATE:

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

Nyní jsme správně aktualizovali všechny naše hodnoty ParentId na nová, uspořádaná ID z naší dočasné tabulky. Jakmile to bude dokončeno, můžeme znovu zavést naše kontroly cizích klíčů, abychom zachovali referenční integritu:

SET foreign_key_checks = 1;

Nakonec zrušíme naši dočasnou tabulku, abychom vyčistili zdroje:

DROP TABLE NewIds

A to je ono.



  1. Jak zdokumentovat databázi SQL Server

  2. Praktické použití funkce SQL COALESCE

  3. Co je omezení primárního klíče v databázi SQL Server - SQL Server / Výukový program T-SQL, část 54

  4. Typ tabulky v příkladu Oracle PL SQL