sql >> Database teknologi >  >> RDS >> Oracle

fordel ved at bruge en trigger til at udfylde surrogatnøgle i oracle plsql

Dette særlige mønster er faktisk ret farligt, da det giver nogen mulighed for manuelt at indtaste et nyt ID, der kan kollidere med en allerede eksisterende surrogatnøgle eller en, som din sekvens kan generere i fremtiden.

Din trigger skal virkelig se sådan ud for at sikre, at du for hver ny plade får en unik nøgle. Hvis du bruger 11.2 eller nyere, er der ikke behov for select ... into ...

CREATE OR REPLACE TRIGGER TEST_TRIG
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
   :new.column1 := my_table_seq.NEXTVAL;
END;

Fordelen ved denne tilgang er, at den altid er Færdig. Uanset hvilken værdi nogen lægger i denne kolonne bliver overskrevet til noget, der vil fungere, og som bruger den korrekte rækkefølge; hvis nogen glemmer at tilføje det i erklæringen, vil det stadig fungere.

Det gør det umuligt at bryde din surrogatnøgle.

Med det du foreslår, forestil dig, at nogen placerer en 1 i stedet for; du får en primær nøgleovertrædelse. Hvis nogen glemmer, er der flere fejl. Du vil aldrig garantere, at hver opdatering til din tabel vil ske gennem et enkelt indgangssted, så udløseren garanterer, at PK er udfyldt korrekt.

Det er værd at bemærke, at du fra 12c kan bruge en identitet kolonne , som ekspliciterer forbindelsen mellem tabel og auto-increment; der er ikke behov for en trigger eller en sekvens. Syntaksen for tabeloprettelse DDL ville være:

create table <table_name> ( <column_name> generated as identity );


  1. Underforespørgsel returnerer mere end 1 række

  2. Er der nogen hash-funktion i PostgreSQL?

  3. opdatering af mysql-tabel ved hjælp af where-parameter fra jtable-celle

  4. Sådan finder du forskellen mellem to datoer i MySQL