Newsgroup: it.comp.software.database
Titolo: Postgres - Aggiunta colonna

Ciao,
devo aggiornare una tabella inserendo una nuova colonna.
Uso Postgres e PHP4 e ho un dubbio.
Per eseguire le prove delle nuove pagine utilizzo una directory a parte
rispetto al sito pubblico. La tabella del DB in cui inserisco e prelevo i
dati è però la stessa.
 
Difatto nei files del sito pubblico non vi è il codice per
inserire/modificare i dati nel nuovo campo (character varying) sia tramite i
form sia mediante comandi SQL.
Mi chiedo se l'inserimento della nuova colonna possa procurare qualche
scompenso.
Grazie mille
Roberto
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 
Impossibile a dirsi senza conoscere l'applicazione, perchè dipende da 
come sono scritte le query. Cioe', se sono tutte query del tipo
"insert into (col1,col2,col3..) values (val1,val2,val3...)"
eccetera, il sito continuerà a funzionare senza problemi anche con la 
colonna in più. Se c'e' una query che dipende dalla morfologia della 
tabella come ad esempio
"insert into tab1 select * from tab2..."
sei fregato.
In summa: crea una nuova tabella "clone" della vecchia, aggiungigli la 
colonna, scrivi la nuova applicazione puntando alla nuova tabella. 
Quando la passi in produzione abbandoni la vecchia tabella.
-- 
Fabrizio "Hermooz" Ermini

Le query sono del tipo:
-SELECT * FROM nome_tabella WHERE nomecampo='.....';
-INSERT INTO nome_tabella VALUES(elenco colonne);
-UPDATE nome_tabella SET (elenco campi da modificare);
So che hai messo l'esempio ma vorrei capire meglio....credo di cadere nel
caso peggiore! vero?
Cosa potrebbe succedere?
Grazie x l'aiuto
Roberto

--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Cosa potrebbe succedere?
che quando vai su una pagine del sito dove c'e' la query "incriminata" 
invece che apparire la pagina come deve viene fuori un bell'SQL warning 
e PHP abortisce il resto dello script... in poche parole il sito non 
funziona più.
Meglio se usi tabelle diverse, come ti ho già detto.
PS: Quota! ;-)
bye!
-- 
Fabrizio "Hermooz" Ermini

 Meglio se usi tabelle diverse, come ti ho già detto.
Ok....la prudenza è la mossa più sensata.
Due ultime domande :-):
X la creazione della tabella clone posso eseguire:
pg_dump -f tabellaclone.sql -c -O -t nometabella nomeDB
Devo poi aprire tabellaclone.sql e alla riga che esegue CREATE TABLE
modificare il nome della tabella precedentemente "fotografata".
Richiamo poi:
 
psql -o tabellaclone.txt -f tabellaclone.sql nomeDB
Se non facessi il passaggio eseguirei una sovrascrittura della tabella già
esistente.
Domanda 1)
Esiste il modo di fare il cambio di nome al volo?
Domanda 2)
La nuova colonna serve per eseguire una query con "WHERE
nuovacolonna='...'".
Come allineo le righe presenti nella tabella prima dell'aggiunta del campo?
Devo necessariamente aggiornare tutte le righe o posso limitarmi solo a
quelle che sono interessate alla query di sopra?
Mi spiego meglio le righe inserite prima della modifica non hanno alcun
valore nella nuova colonna...è un problema se non vado a settare il nuovo
campo nelle righe che non lo usano?
Grazie mille
Roberto


 campo nelle righe che non lo usano?
Io seguirei una strada leggermente diversa:
1) crei la nuova tabella ex-novo, con un opportuno statement CREATE 
TABLE, sistemando se necessario anche l'ordine delle colonne nella 
maniera che ti sembra più logica dopo l'inserimento del nuovo attributo;
2) popoli la nuova tabella con uno statement insert/select attingendo 
dalla vecchia e sistemando con valori di default che abbiano senso gli 
attributi "nuovi".
vale a dire: se la vecchia tabella è
tab1(item1 int4, item2 text, item3 text)
e la nuova invece
tab2(item1 int4, itemnuovo int4, item2 text, item3 text)
supponendo che '0' sia un valore sensato come default per la nuova 
colonna "itemnuovo" puoi poi fare:
insert into tab2 (item1, itemnuovo, item2, item3)
	select item1,'0', item2,item3 from tab1;
e così ti prepari la nuova tabella con il nuovo formato, popolata con 
gli stessi dati della vecchia "integrati" con la colonna in più.


 colonna in più. 
Mica vero!
Se la colonna nuova inserita non prevede un valore default ogni insert
che non prevede quella colonna fallira'.
G.


wrote:

Solo se la colonna e' dichiarata NOT NULL, altrimenti il valore inserito
sara' NULL e la insert avra' successo:
=> CREATE TABLE test (x integer, y integer);
=> INSERT INTO test VALUES (42);
=> SELECT * FROM test;
 x  | y
----+---
 42 |
=>  ALTER TABLE test ADD COLUMN z integer;
=> ALTER TABLE test ALTER COLUMN z SET NOT NULL;
ERROR:  column "z" contains null values
=> DELETE FROM test;
=> ALTER TABLE test ALTER COLUMN z SET NOT NULL;
ALTER TABLE
=> INSERT INTO test VALUES (42);
ERROR:  null value in column "z" violates not-null constraint
=> DROP TABLE test;
Leonardo
-- 
Nach doiligh domhsa mo chailin a mholadh
'S ni he amhain mar bhi si or
Bhi si mar gath greine a dhul in eadan na gloinne
Is bhi sceimh mhna na finne le mo cailin or


| wrote:
|>>Impossibile a dirsi senza conoscere l'applicazione, perchè dipende da
|>>come sono scritte le query. Cioe', se sono tutte query del tipo
|>>"insert into (col1,col2,col3..) values (val1,val2,val3...)"
|>>eccetera, il sito continuerà a funzionare senza problemi anche con la
|>>colonna in più.
|>
|>Mica vero!
|>
|>Se la colonna nuova inserita non prevede un valore default ogni insert
|>che non prevede quella colonna fallira'.
|
|
| Solo se la colonna e' dichiarata NOT NULL, altrimenti il valore inserito
| sara' NULL e la insert avra' successo:
ovvio.
G.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (MingW32)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQE/z43G7UpzwH2SGd4RAqGcAJ0e5b5a0xysdn9PLxubrGRhAN22JwCdHKqB
TcSu0bCDqhJgpDalzGu0R44=
=g1HW
-----END PGP SIGNATURE-----