sql >> Database teknologi >  >> RDS >> PostgreSQL

Opdater sekvens på række INSERT

Det er en kendt begrænsning:sekvenser øges under opkaldet af nextval() funktion, som er din standardværdi for dit felt. Når du leverer data på INSERT til det felt evalueres standardværdiens udtryk ikke, det er derfor, sekvensens værdi ikke berøres.

En løsning er at konfigurere en trigger før/efter INSERT for manuelt at rette sekvensens værdi med setval() . Men på denne måde bør du skal konfigurere en trigger på OPDATERING også på det felt for at rette sekvensens værdi, når du bare opdaterer et eksisterende id til et højere id.

En anden løsning er, at du skriver en lagret funktion, som kan producere en tilgængelig værdi for det felt og indstille dit felts standardværdi til den funktions returværdi. Noget, som:

LOOP
    result = nextval('my_id_seq');
    EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;

Men vær advaret:Standardfunktionaliteten for sekvenser er sikker for samtidige indsættelser (sekvensens aktuelle tilstand er global - transaktionsuafhængig). Hvis du angiver eksplicitte værdier til disse felter, vil det ikke være tilfældet.




  1. Sådan forbedres hastigheden på InnoDB-skrivning per sekund af MySQL DB

  2. Undtagelse i trådens hoved org.hibernate.MappingException:Ukendt enhed

  3. Oracle DB simpel SELECT, hvor kolonnerækkefølgen har betydning

  4. Hvorfor ruller transaktioner ikke tilbage, når du bruger SpringJUnit4ClassRunner/MySQL/Spring/Hibernate