sql >> Databasteknik >  >> RDS >> PostgreSQL

Sqlalchemy och PostgreSql:hur ställer man in primärnyckeln manuellt utan konflikter i framtiden?

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å.




  1. MySQL utf8mb4, Fel vid lagring av emojis

  2. Hur lagras datum i Oracle?

  3. Hur man hämtar alla poster med främmande nyckel med Laravel

  4. PHP tar 90 gånger längre tid att köra frågan än MySQL-klienten