sql >> Databasteknik >  >> RDS >> PostgreSQL

Uppdatera sekvens på rad INSERT

Det är en känd begränsning:sekvenser ökas under anropet av nextval() funktion, vilket är ditt standardvärde för ditt fält. När du anger data på INSERT i det fältet utvärderas inte standardvärdets uttryck, det är därför sekvensens värde inte berörs.

En lösning är att ställa in en trigger före/efter INSERT för att manuellt fixa sekvensens värde med setval() . Men på det här sättet bör måste ställa in en trigger på UPDATE på det fältet också, för att fixa sekvensens värde, när du bara uppdaterar något befintligt id till ett högre id.

En annan lösning är att du skriver en lagrad funktion, som kan producera ett tillgängligt värde för det fältet och ställa in ditt fälts standardvärde till den funktionens returvärde. Något, som:

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

Men varnas:standardfunktionen för sekvenser är säker för samtidiga insättningar (det aktuella tillståndet för sekvensen är globalt - transaktionsoberoende). Om du anger explicita värden till dessa fält, kommer det inte att vara fallet.




  1. Använd MySQLi Prepared Statement för att ange dynamiska, flera rader i databasen?

  2. Radstorleken är för stor fel i mysql skapa tabellfråga

  3. Hur man designar ett geografiskt distribuerat MariaDB-kluster

  4. Använda med klausulen SQL Server 2008