Tabelle für die Beispiele
create table teach_clients
(
id_clients number not null,
vorname varchar2(255),
zuname varchar2(255) not null,
geburtsdatum date,
constraint teach_clients_pk primary key
(
id_clients
)
enable
)
Unterabfrage mit Aggregatfunktion
insert into teach_clients
values
(
(
select
case
when max(id_clients) >= 1
then to_char(max(id_clients) + 1)
else to_char(1)
end
from teach_clients
),
'René',
'Tuchscherer',
'10.02.1963'
)
Trigger und Sequenz
Man erzeugt zwei zusätzliche Datenbankobjekte, eine Sequence und einen Trigger. Die Sequenz erzeugt die einzusetzenden Werte, der before-insert Trigger sorgt dafür, dass der neue Wert als erstes in der neuen Zeile landet.Man kann statt start with 1 auch eine andere Zahl einsetzen, mit der begonnen werden soll.Das increment by 1 kann man eigentlich weglassen, weil es die Default-Einstellung ist.Der Parameter nomaxvalue sagt der Sequence, das sie für immer und ewig zu inkrementieren hat und nicht an irgendeinem Wert ein Reset machen soll.
-- die Sequenz erzeugen
create sequence id_clients_seq
start with 1
increment by 1
nomaxvalue;
-- den Trigger erzeugen
create trigger id_clients_trigger
before insert on teach_clients
for each row
begin
select id_clients_seq.nextval
into :new.id_client
from dual;
end;
Es kann übrigens durchaus sein, dass Zahlen "übersprungen" werden, weil sie von Oracle im Cache gehalten werden, um die Eindeutigkeit zu sichern. Wenn man also lückenlos aufsteigende Nummern haben muss, wäre dieser Ansatz nicht ausreichend.
Keine Kommentare:
Kommentar veröffentlichen