Sequenze in PostgreSQL: aggiornare il valore corrente

Questo breve articolo mostra come aggiornare in modo semplice il valore corrente di una sequenza per una tabella rispetto ai valori presenti nella tabella stessa. Può essere utile in seguito a operazioni di caricamento di dati.

Le sequenze in PostgreSQL sono un’ottimo strumento per gestire in modo concorrente l’assegnazione di numeri sequenziali. Spesso sono usati per gestire i campi identificativi (id) delle tabelle.

In PostgreSQL le sequenze possono essere usate in modo esplicito (creando l’oggetto di tipo sequence e poi assegnando il valore di default di un campo) oppure in modo implicito, dichiarando un tipo di dato come serial.

Per maggiori informazioni, si vedano le pagine del manuale su:

Coloro che provengono dal mondo MySQL noteranno la somiglianza con il qualificatore AUTO_INCREMENT.

Ad ogni modo, l’obiettivo dell’articolo è quello di fornire un modo semplice per aggiornare il valore corrente di una sequence sulla base dei valori presenti nella tabella.

L’operazione ha un suo scopo nelle operazioni di caricamento dei dati.

Supponiamo di avere una tabella customers con il campo id_customer associato alla sequenza customers_seq.


CREATE SEQUENCE customers_seq;
CREATE TABLE customers (
id_customer INTEGER NOT NULL
DEFAULT nextval('customers_seq') PRIMARY KEY,
...
);

Supponiamo di volerla esportare:


copy customers TO 'dati/customers.txt'

e quindi importare in un’altra istanza di PostgreSQL o in un alto database. Il comando da lanciare utilizzando l’applicazione da console psql è:


copy customers FROM 'dati/customers.txt'

si occupa semplicemente di importare i dati. Ma in seguito a questa operazione, la sequenza non sarà stata aggiornata e il primo inserimento automatico di un record nella tabella genererà un errore di violazione della chiave primaria.

E’ pertanto necessario aggiornare il valore corrente della sequenza prima di mettere in produzione il database, lanciando una semplice query di aggiornamento:


select setval('customers_seq', max(id_customer)) FROM customers;

Come ultimo riferimento, si consiglia una lettura della pagina sulle funzioni per le sequenze.

This Post Has 0 Comments

Leave A Reply