2009-03-04 5 views
2

Natürlich, wenn ich genug Reihen setze, wird es eine Wiederholung geben. Aber nehmen wir an, ich wähle ein groß genug ID-Feld.Werden in Mysql garantiert, dass ids nicht wiederholt werden, selbst wenn Zeilen gelöscht werden?

Ich möchte wissen, ob ich annehmen kann, dass die ID die Zeile im Laufe der Zeit eindeutig identifiziert. Und wenn der Klient mir eine ID schickt, möchte ich bestimmen können, auf welche Zeile er verweist oder ob die Zeile gelöscht wurde (oder wenn es eine gefälschte ID ist, aber in diesem Fall würde es mir nichts ausmachen falsch zu sagen, dass die Zeile war gelöscht).

Bitte beachten Sie auch die folgende: Wenn ich die Datenbank neu starten, oder Backup und Restore - wird es auch weiterhin IDs zu schaffen, wo sie verlassen - oder sein kann, wird es sich entscheiden, „in die Löcher zu füllen“

Antwort

4

Wenn Sie haben einen "int not null auto increment Primärschlüssel", den Sie nie zurücksetzen, dann werden ja IDs nicht wiederverwendet.

Dies wirft jedoch eine interessante Frage auf - was passiert wenn Sie eine alte ID wiederverwenden (obwohl es in MySQL standardmäßig nicht passieren wird, aber der menschliche Faktor immer zählt)?

Wenn Ihre Datenbank richtig normalisiert ist, kaskadiert und eingeschränkt Ihre Anwendung sollte in der Lage sein, die Wiederverwendung einer ID zu behandeln.

bearbeiten (da Sie Ihren Beitrag bearbeitet, ich werde meine Antwort Fleisch aus), über dieses Zitat: „Und wenn der Kunde sendet mir eine id ich in der Lage sein zu bestimmen, welche Zeile bezieht er oder wenn die Zeile wurde gelöscht ". Es ist immer möglich zu bestimmen, zu welcher Zeile eine ID gehört, wenn sie nicht gelöscht wird (wichtig, um Informationen aus Ihrer Datenbank extrahieren zu können).

jedoch, wenn die Zeile die ID bezieht sich auf gelöscht wird, dann ist es nicht möglich zu bestimmen, welche Zeile es zu ... gehört, da sie nicht da ist. Wenn Sie dies benötigen, würde ich Ihnen raten, eine Art von Auditing-Funktionalität zu implementieren, vorzugsweise durch triggers.

+0

und wann setze ich es zurück? Ist es etwas, was ich mit einem Befehl mache oder kann es als Nebeneffekt von etwas passieren? – flybywire

+0

Nun, es ist nicht etwas, was wahrscheinlich passieren wird - aber es ist möglich durch verschiedene SQL-Befehle in MySQL. – thr

+0

Wenn Sie sich nicht sicher sind, wann Sie es zurücksetzen sollen, dann setzen Sie es nicht zurück. Automatisch generierte IDs sollen weder sinnvoll noch wiederverwendbar sein. – tehvan

2

Der aktuelle Autoinkrement-Wert wird über Backup/Restores über ein zusätzliches Attribut in der Tabelle beibehalten. Sie können es in einer Müllhalde sehen kurz nach dem ENGINE =:

mysql> create table foo (bar int(11) primary key auto_increment); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into foo() values(),(),(),(); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> show create table foo \G 
*************************** 1. row *************************** 
     Table: foo 
Create Table: CREATE TABLE `foo` (
    `bar` int(11) NOT NULL auto_increment, 
    PRIMARY KEY (`bar`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

Sie können es „ALTER TABLE Tabellenname AUTO_INCREMENT =“ zurückgesetzt werden, aber es scheint mir, wie der Attributwert wird ignoriert, wenn dies nicht der Fall mehr als die maximal vorhandene ID, wenn Sie eine Einfügung durchführen.

0

Beachten Sie auch, dass das beschriebene Verhalten, eine zuvor verwendete ID nicht wiederzuverwenden, für die MyISAM-Engine gültig ist, aber nicht für alle verfügbaren Engines gültig ist.

Verwandte Themen