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

Sqlalchemy e PostgreSql:come impostare manualmente la chiave primaria senza conflitti in futuro?

Non sono a conoscenza di alcun modo sicuro ed efficiente per fare quello che vuoi. Dovresti davvero scegliere se vuoi definire tu stesso le chiavi o utilizzare le chiavi generate e attenersi a una strategia o all'altra.

Se non ti dispiace la terribile simultaneità, puoi LOCK TABLE thetable , fai il tuo lavoro, setval la sequenza dell'identificatore della tabella al successivo valore libero dopo quello che hai inserito e commit per rilasciare il blocco. Tuttavia, ciò causerà comunque problemi con le app che chiamano esplicitamente nextval (come molti ORM) piuttosto che lasciare che il database definisca il valore omettendolo dal ?INSERT elenco di colonne o nominandolo esplicitamente come DEFAULT .

Altrimenti potresti fare in modo che il tuo codice (o una funzione di supporto PL/PgSQL) esegua l'inserimento in un ciclo di tentativi che incrementa la chiave e riprova quando riceve un errore di integrità. Questa strategia non funzionerà se devi fare più di un semplice inserimento per transazione. Inoltre in SERIALIZABLE modalità di isolamento Non penso che tu possa farlo con PL/PgSQL, devi usare un ciclo di tentativi lato client per gestire gli errori di serializzazione.

È un'idea terribile. Utilizzare le chiavi definite dall'applicazione in modo coerente o le chiavi definite dal database in modo coerente. Non mischiare le due cose.