CREATE TABLE mioschema.impiegati(
ID_Imp serial,
imp_codice text,
imp_cognome text,
imp_nome text,
PRIMARY KEY(ID_Imp),
UNIQUE(imp_codice)
);
– vari inserimenti con lo stesso schema devo ancora capire le funzioni di PostgreSQL.
INSERT INTO mioschema.impiegati (imp_codice, imp_cognome, imp_nome) VALUES ('codice6', 'Sergia', 'Mellina');
SELECT nextval('mioschema.impiegati_id_imp_seq');
INSERT INTO mioschema.impiegati (ID_Imp, imp_codice, imp_cognome, imp_nome) VALUES (nextval('mioschema.impiegati_id_imp_seq'), 'codice8', 'Lucia', 'Mondello');
INSERT INTO mioschema.impiegati VALUES (nextval('mioschema.impiegati_id_imp_seq'), 'codice9', 'Lorenzo', 'Tramaglino');
NOTA2: Avendo letto con SELECT il nextval mi si è creato un vuoto.
Nella tabella hai creato il campo ID_Imp specificando come tipo di dato SERIAL, che è uno speciale tipo di INTEGER ad autoincremento. Quando specifichi il tipo SERIAL per un campo PostgreSQL crea automaticamente una sequenza associata ad esso per generare il valore che andrà immesso nel recordo successivo. In effetti le istruzioni:
CREATE TABLE fornitore
(
fornitore_id serial,
...
);
oppure
CREATE SEQUENCE fornitore_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
CREATE TABLE fornitore
(
fornitore_id integer DEFAULT nextval('fornitore_id_seq'::regclass),
...
)
sortiscono lo stesso effetto. Ad ogni inserimento di record nella tabella il campo fornitore_id verrà incrementato di un intero.
Il vantaggio di utilizzare una sequenza personalizzata consiste nel fatto che puoi determinare quale sia il valore dell'incremento.
CREATE SEQUENCE fornitore_id_seq
INCREMENT 2
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
genera una successione di soli interi dispari.
L'incremento è inteso in senso algebrico.
CREATE SEQUENCE prova_id_seq
INCREMENT -1
MINVALUE 10
MAXVALUE 1000
START 1000
CACHE 1;
genera una squenza decrementale.
NOTA2: Avendo letto con SELECT il nextval mi si è creato un vuoto.
l'istruzione SELECT nextval('nome_sequenza'::regclass) non fa altro che forzare l'incremento della sequenza, non avendo inserito record nella tabella cui questa si riferisce ottieni un 'vuoto'. Esistono alcuni metodi per manipolare le sequenze.
DOMANDA: Ho visto che ci sono parecchie funzioni in PostgreSQL immagino che siano più veloci di quanto può fare Gambas ciclando la SQL, come ti regoli di solito?
Penso ti riferisca ai metodi del componente gb.db come
Connection.Find,
Connection.Edit ... il quale ha lo scopo di creare un livello intermedio tra l'applicazione ed il database. Non sapendo a priori quale DB userai (SQLite, MySQL,PostgreSQL) questi metodi ti sono di notevole aiuto, poichè non dovrai modificare il codice per adattarlo ad eventuali realtà differenti. Sarà Gambas a convertire l'istruzione nella sintassi corretta.
Se diversamente stai scrivendo una applicazione che utilizzerà solo e comunque uno specifico DB, allora con il comando Connection.Exec("istruzione sql") potrai ottenere un maggior controllo al costo di qualche riga di codice (ed eventuali errori) in più.
Libero arbitrio....
Ho visto che per usare COPY, ad esempio molto potente per copiare i dati da un file di testo, occorre avere i privilegi di super user; è possibile cambiare ruolo durante l'utilizzo da parte dell'utente? Oppure c'è un modo per dare questo specifico privilegio ad un user?
Ti riferisci al comando COPY di sql oppure al comando \copy di psql? Ad ogni modo, per utilizzare il comando COPY (FROM/TO) da sql devi possedere il privilegio di SELECT (per COPY TO) sulla tabella da cui vuoi prelevare i dati, il privilegio INSERT per la tabella in cui scrivere i dati (per COPY FROM). In realtà ti basta avere quei privilegi per le colonne che utilizzi nel comando.
Chiaro?
Infine NO il privilegio di SUPERUSER non può ssere cambiato al volo. Puoi assegnarlo nella fase di creazione dell'utente o utilizzare in seguito l'istruzione
ALTER ROLE nomeutente WITH SUPERUSER;