2009-08-06 10 views

Antwort

0

Sie wollen AUTO_INCREMENT.

Obwohl das Zurücksetzen auf 99999 möglicherweise ein Problem sein kann. Ich würde auch Ihre Anforderung in Frage stellen, dass es so funktioniert.

+0

Ich glaube nicht, dass es eine Möglichkeit gibt, 'auto_increment' zurückzusetzen, es sei denn, Sie löschen Zeilen, schneiden die Tabelle ab oder erstellen die Spalte neu. – Eric

0

Wenn Sie es zurücksetzen müssen, können Sie einen Trigger erstellen:

create trigger auto_number before insert on `sometable` 
begin 
    new.autoid = coalesce((select max(autoid)+1 from sometable),0) % 1000000 
end 

Wesentlichen, wenn ein insert auftritt, dies setzt lediglich die autoid Spalte als die nächstgrößere ID. Es verwendet jedoch Modulo, um sicherzustellen, dass sich die Zahl bei 1.000.000 wiederholt.

+0

Dies wird nicht funktionieren. Sie werden das maximale Autoid treffen, und dann wird Max (Autoid) eine Konstante werden. Sie werden also wiederholt die gleiche ID generieren. Ganz zu schweigen davon, dass es besser ein schöner Index sein sollte, oder das wird/langsam/sein. – derobert

+0

@derobert: .... das ist, was das OP gefragt hat. 0 bis 99999, dann wiederholen Sie alles noch einmal. – Eric

1

Generieren eine immer Inkrementieren Anzahl (beispielsweise ein Standard-auto_increment) und dann, wenn die Daten (oder über eine Ansicht) Auswählen, laufen sie durch mod 100000:

⋮ 
99998 % 100000 = 99998 
99999 % 100000 = 99999 
100000 % 100000 = 0 
100001 % 100000 = 1 
⋮ 

Sie können diese transparent machen, indem eine Ansicht zur Auswahl:

CREATE SQL SECURITY INVOKER VIEW whatever AS 
    SELECT 
    foo, bar, baz, autoid % 100000 AS autoid, taz 
    FROM base_table; 

Leider wird diese Ansicht wahrscheinlich nicht aktualisierbar sein und MySQL unterstützt nicht INSTEAD OF Trigger, so dass Sie die zugrunde liegende Tabelle senden müssen würden schreibt.

+0

meinst du, es wäre einfach besser, wenn ich das stattdessen machen würde? – EddyR

+0

@EddyR: Keine Ahnung, ob es besser wäre, PHP das machen zu lassen; Du hast überhaupt nicht beschrieben, warum du das machen willst. – derobert