Ich habe eine Tabelle, die eine automatisch inkrementierte Primärschlüssel-ID enthält. Wenn ich die letzte Zeile lösche (höchste ID, zum Beispiel ID = 6) und eine neue Zeile einfüge, beginnt die neue ID bei 7. Welchen Parameter muss ich ändern, damit der Primärschlüssel bei 6 beginnt?
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
Ergebnis:
ID Name
1 Hund
2 Katze
3 Pinguin
4 Lax
5 Wal
6 Strauß
DELETE FROM animals WHERE id = 6;
INSERT INTO animals (name) VALUES
('x');
Ergebnis:
ID Name
1 Hund
2 Katze
3 Pinguin
4 Lax
5 Wal
7 x
Danke für den Rat.
mysql
primary-key
mariadb
auto-increment
Giordano
quelle
quelle
Antworten:
Dies ist beabsichtigt - alle DBMS-Aktionen wurden mit Spalten für die automatische Inkrementierung ausgeführt.
Andernfalls könnte die externe referenzielle Integrität beschädigt werden. Stellen Sie sich als einfaches Beispiel vor, Sie speichern URLs für einen Verkürzungsdienst mit einer Spalte für die automatische Inkrementierung als Schlüssel. Sie wissen noch nicht, ob die verkürzte URL an jemanden weitergegeben wurde, und die Datenbank sicherlich nicht. Daher kann die Wiederverwendung der ID 1234 dazu führen, dass die arme Oma von jemandem somenastypornsite.xxx besucht, anstatt lovelyknitting.org, wenn sie auf http: / klickt /shortthi.ng/1234 in einer alten E-Mail, anstatt die Meldung "Entschuldigung, aber dieser Link ist in unseren Datensätzen nicht mehr vorhanden" zu erhalten.
Wenn Sie das Inkrement nach dem Löschen des letzten Elements zurücksetzen, werden Sie dann auch die ganze Arbeit (oder die Erwartung der Datenbank) durchlaufen, alles nach dem 5. Element von 5 Millionen neu zu nummerieren, wenn das 5. Element entfernt wird? komplett mit Änderungen an anderen Tabellen, bei denen Fremdschlüsseleinschränkungen auf die Inkrementspalte verweisen? Solche zusätzliche Arbeit könnte in Bezug auf E / A sehr teuer werden.
Wenn Sie tun , den Zuwachs Punkt zurückgesetzt , nachdem das letzte Element zu löschen, sei sehr , sehr vorsichtig Ihrer Transaktionsisolationsstufen: Sie setzen könnte es nur als eine andere Transaktion Fabrikaten der Wert verwenden, was zu Fehlern (oder noch schlimmer, leise Ausfälle), es sei denn , Sie stellen sicher, dass Ihre Aktion vollständig zu 100% isoliert ist.
Ich empfehle generell Leuten, die mit Datenbanken arbeiten, "SQL Antipatterns" zu lesen, das ein Kapitel zu diesem Thema mit dem Namen "Psuedo-Key Neat Freaks" enthält (das die Angelegenheit auf eine freundlichere Art und Weise behandelt, als der Kapiteltitel für manche vermuten lässt!). Wenn der Wert eine Bedeutung hat, die nicht nur ein Schlüssel ist (oder höchstens Informationen zur Einfügungsreihenfolge enthält), sollte er wahrscheinlich keine automatisch inkrementierende Spalte sein, und wenn er keine Bedeutung hat, die über die Bedeutung eines Schlüssels hinausgeht (oder höchstens eine Einfügereihenfolge enthält) Informationen) dann sollten Lücken keine Rolle spielen.
quelle
Sie können den Wert für auto_increment folgendermaßen zurücksetzen:
Sie müssen den in der Tabelle vorhandenen Maximalwert ermitteln und diesem Wert 1 hinzufügen, um ihn in der obigen Anweisung zu verwenden.
quelle