Dieses spezielle Muster ist eigentlich ziemlich gefährlich, da es jemandem ermöglicht, manuell eine neue ID einzugeben, die mit einem bereits vorhandenen Ersatzschlüssel oder einem, den Ihre Sequenz in Zukunft generieren könnte, kollidieren könnte.
Ihr Trigger sollte wirklich so aussehen, um sicherzustellen, dass jeder neue Datensatz einen eindeutigen Schlüssel erhält. Wenn Sie 11.2 oder höher verwenden, ist select ... into ...
nicht erforderlich
CREATE OR REPLACE TRIGGER TEST_TRIG
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
:new.column1 := my_table_seq.NEXTVAL;
END;
Der Vorteil dieses Ansatzes ist, dass es immer ist erledigt. Welchen Wert auch immer jemand für diese Spalte eingibt, er wird mit etwas überschrieben, das funktioniert und die richtige Sequenz verwendet; Wenn jemand vergisst, es in die Anweisung aufzunehmen, funktioniert es immer noch.
Es macht es unmöglich, Ihren Ersatzschlüssel zu knacken.
Stellen Sie sich bei dem, was Sie vorschlagen, vor, dass jemand stattdessen eine 1 setzt; Sie erhalten eine Primärschlüsselverletzung. Wenn jemand es vergisst, gibt es mehr Fehler. Sie können niemals garantieren, dass jede Aktualisierung Ihrer Tabelle über einen einzigen Einstiegspunkt erfolgt, sodass der Trigger garantiert, dass der PK korrekt ausgefüllt wird.
Es ist erwähnenswert, dass Sie ab 12c eine Identität verwenden können Spalte , was die Verknüpfung zwischen Tabelle und Autoinkrement explizit macht; Es ist kein Trigger oder eine Sequenz erforderlich. Die Syntax für die Tabellenerstellungs-DDL wäre:
create table <table_name> ( <column_name> generated as identity );