Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wypełnić dziury w polach autoinkrementacji?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PlanetScale &Vitess:Integralność referencyjna ze starszymi bazami danych podzielonych na fragmenty

  2. Jak używać niepodpisanych typów int/long z Entity Framework?

  3. Funkcja MySQL TAN() – zwraca tangens wartości w MySQL

  4. Utwórz indeks na ogromnej tabeli produkcyjnej MySQL bez blokowania tabeli

  5. Sprawdź, czy tabela MySQL istnieje bez użycia składni select from?