Tento konkrétní vzorec je ve skutečnosti docela nebezpečný, protože umožňuje někomu ručně zadat nové ID, které by mohlo být v rozporu s již existujícím náhradním klíčem nebo s tím, který by vaše sekvence mohla vygenerovat v budoucnu.
Váš spouštěč by měl skutečně vypadat takto, abyste zajistili, že pro každý nový záznam dostane jedinečný klíč. Pokud používáte 11.2 nebo vyšší, není potřeba select ... into ...
CREATE OR REPLACE TRIGGER TEST_TRIG
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
:new.column1 := my_table_seq.NEXTVAL;
END;
Výhodou tohoto přístupu je, že je vždy Hotovo. Jakákoli hodnota, kterou kdokoli vloží do tohoto sloupce, se přepíše na něco, co bude fungovat a které používá správnou sekvenci; pokud to někdo zapomene přidat do prohlášení, bude to stále fungovat.
Znemožňuje to prolomit váš náhradní klíč.
S tím, co navrhujete, si představte, že někdo místo toho umístí 1; dojde k porušení primárního klíče. Pokud někdo zapomene, je tam více chyb. Nikdy nezaručíte, že každá aktualizace vaší tabulky bude provedena prostřednictvím jediného vstupního bodu, takže spouštěč zaručuje, že PK bude vyplněn správně.
Stojí za zmínku, že od 12c můžete používat identitu sloupec , což explicitně ukazuje vazbu mezi tabulkou a automatickým přírůstkem; není potřeba spoušť ani sekvence. Syntaxe DDL pro vytvoření tabulky by byla:
create table <table_name> ( <column_name> generated as identity );