2017-03-07 2 views
0

Wie kann ich einen Primärschlüssel haben, der automatisch inkrementiert wird? zum Beispiel: wenn ich etwas am Feldnamen einfügen, sollte die Feld-ID einen Wert zuweisen, der +1 ist, dass der letzte ist.SQL-Primärschlüssel-Inkrement

 
id, name 
1, test1 
2, test2 

so füge ich den Namen so etwas wie testX und die ID sollte automatisch als 3

zugeordnet werden, wie kann ich das tun?

+2

Verwenden Sie einen serverseitigen Generator? – MartynA

+0

Warum haben Sie dieses Q '[delphi]' markiert? Es ist eindeutig IB/Firebird Frage. –

+0

@FreeConsulting Nun, die nächste Frage wäre Delphi-bezogen, würde er fragen, welche Bibliotheken INSERT-RETURNING oder andere althergebrachte Möglichkeiten zum Abrufen automatisch generierter ID zurück in die App unterstützen: -D –

Antwort

5

Neben der ain zu beantworten, können Sie generator wie verwenden:

erstellen Generator:

CREATE GENERATOR <name>; 
SET GENERATOR <name> TO <value>; 

Erhalten Sie den aktuellen Wert des Generators:

SELECT GEN_ID(<GeneratorName>, 0) FROM RDB$DATABASE; 

Den nächsten Wert generieren

SELECT GEN_ID(<GeneratorName>, 1) FROM RDB$DATABASE; 

Mit Generator in Trigger

CREATE OR ALTER trigger <trigger_name>_bi for <table_name> 
active before insert position 0 
as 
begin 
    if (new.id is null) then 
    new.id = gen_id(my_generator,1); 
end 

Wenn Sie numeration wollen, ohne Löcher, die Sie sehr vorsichtig sein.

Generatoren/Sequenzen sind nicht transaktional.
Sobald Sie einen Wert erhalten, wenn Ihr Vorgang fehlschlägt, haben Sie ein Loch.

3

Wenn Sie mit Firebird 3 können Sie die identity column Funktion verwenden:

create table T (
    id integer generated by default as identity primary key, 
    ... 
); 

Wenn Sie etwas ältere Version von Firebird verwenden, dann eine Sequenz mit Trigger kann verwendet werden, um die autoincrement zu erreichen :

create table T (
    id integer primary key, 
    ... 
); 

CREATE SEQUENCE t_seq; 

create trigger t_gen_id 
    active before insert 
    on T 
as 
begin 
    if(new.id is null)then new.id = next value for t_seq; 
end; 

Seit Firebird 2

die returning clause wird unterstützt, was sehr praktisch ist, um den ID-Wert auf der Serverseite erzeugt zu bekommen.