Jag är inte medveten om något säkert och effektivt sätt att göra vad du vill. Du bör verkligen välja om du vill definiera nycklarna själv eller använda genererade nycklar och hålla fast vid den ena eller den andra strategin.
Om du inte har något emot fruktansvärd samtidighet kan du LOCK TABLE thetable
, gör ditt arbete, setval
tabellens identifierarsekvens till nästa lediga värde efter det du infogade, och commit
för att frigöra låset. Det kommer dock fortfarande att orsaka problem med appar som uttryckligen anropar nextval
(som många ORM) istället för att låta databasen definiera värdet genom att utelämna det från ?INSERT
kolumnlista eller uttryckligen namnge den som DEFAULT
.
Annars kan du få din kod (eller en PL/PgSQL-hjälparfunktion) att infoga i en återförsöksslinga som ökar nyckeln och försöker igen när den får ett integritetsfel. Den här strategin fungerar inte om du behöver göra mer än bara en infogning per transaktion. Dessutom i SERIALIZABLE
isoleringsläge Jag tror inte att du kan göra det med PL/PgSQL, du måste använda en försöksslinga på klientsidan för att hantera serialiseringsfel.
Det är en hemsk idé. Använd antingen programdefinierade nycklar konsekvent eller databasdefinierade nycklar konsekvent. Blanda inte de två.