sql >> Databasteknik >  >> RDS >> Oracle

fördelen med att använda en trigger för att fylla i surrogatnyckel i oracle plsql

Det här specifika mönstret är faktiskt ganska farligt eftersom det tillåter någon att manuellt mata in ett nytt ID som kan kollidera med en redan existerande surrogatnyckel eller en som din sekvens kan generera i framtiden.

Din trigger bör verkligen se ut så här för att säkerställa att för varje ny skiva får en unik nyckel. Om du använder 11.2 eller högre finns inget behov av select ... into ...

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

Fördelen med detta tillvägagångssätt är att det alltid är Gjort. Vilket värde någon än lägger in för den här kolumnen skrivs över till något som kommer att fungera och som använder rätt sekvens; om någon glömmer att lägga till det i uttalandet kommer det fortfarande att fungera.

Det gör det omöjligt att bryta din surrogatnyckel.

Med det du föreslår, föreställ dig att någon sätter en 1:a istället; du får en primärnyckelöverträdelse. Om någon glömmer så finns det fler fel. Du kommer aldrig att garantera att varje uppdatering av din tabell kommer att ske via en enda ingångspunkt, så utlösaren garanterar att PK är korrekt ifyllt.

Det är värt att notera att du från 12c kan använda en identitet kolumn , som tydliggör kopplingen mellan tabell och automatisk ökning; det finns inget behov av en trigger eller en sekvens. Syntaxen för tabellskapande DDL skulle vara:

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


  1. Partial Index används inte i ON CONFLICT-satsen när du utför en upsert i Postgresql

  2. Sequelize upsert() uppdateras aldrig och bara infogar

  3. Hur kan jag fråga alla mina data inom ett avstånd av 5 meter?

  4. vad är skillnaden mellan join nyckelord och inner join nyckelord i oracle sql?