Acrescentando... Um alter table significa um lock de tabela, criação de uma nova tabela, e rename da mesma...
Na pratica, um backup fará o mesmo, apenas serão mais passos. Pra complicar um pouco mais, acrescento uma sugestão para pensar ;) Ou... se vc tiver espaço em disco suficiente, pode criar uma tabela nova, inserir os dados e renomear as tabelas. alter table old rename to old_temp; create table new ( col1, col2 ) insert into new ( col1, col2 ) select col1, col2 from old; alter table old_temp rename to old_old; alter table new rename to old; Sds, Marco Antonio jota.comm wrote: > Olá, > > No PostgreSQL não tem como adicionar uma coluna especificando a > posição em uma tabela já existente pelo comando alter table. > > O Roberto deu uma solução usando o catálogo do PostgreSQL mas como ele > mesmo mencionou não é nada recomendável fazer dessa maneira. Eu também > não aconselho a fazer isso, você pode ter problemas. > > Outra possibilidade seria fazer backup, deletar a tabela, recriar e > inserir os dados na forma correta. > > Porém, qual a necessidade de você especificar a ordem para a coluna > desejada, isso é fundamental para você? > > []s > > 2008/2/7, Roberto Mello <[EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]>>: > > 2008/2/7 sergio <[EMAIL PROTECTED] > <mailto:[EMAIL PROTECTED]>>: > > > > > > Bom Dia. > > > > Quando acrescento um campo novo em uma tabela já existente, ele > passa a ser > > o último campo. Tem como eu colocá-lo em 3º por exemplo? > > Altere o dicionario de dados, a seu proprio risco. Aqui vai como, mas > nao faco garantia nenhuma sobre a integridade dos seus dados ao mexer > assim com o dicionario de dados. > > test=# \d foobar > Table "pg_temp_1.foobar" > Column | Type | Modifiers > ----------+-----------------------+----------- > id | integer | > segunda | character varying(50) | > terceira | character varying(50) | > > > teste=# SELECT c.oid, > teste-# n.nspname, > teste-# c.relname > teste-# FROM pg_catalog.pg_class c > teste-# LEFT JOIN pg_catalog.pg_namespace n ON n.oid = > c.relnamespace > teste-# WHERE c.relname ~ '^(foobar)$' -- Nome da minha tabela > (foobar) aqui > teste-# AND pg_catalog.pg_table_is_visible(c.oid) > teste-# ORDER BY 2, 3; > oid | nspname | relname > ---------+-----------+--------- > 7002157 | pg_temp_1 | foobar > (1 row) > > teste=# select attrelid, attname, attnum from pg_catalog.pg_attribute > where attrelid = '7002157' AND attnum > 0 AND NOT attisdropped; > > attrelid | attname | attnum > ----------+----------+-------- > 7002157 | id | 1 > 7002157 | segunda | 2 > 7002157 | terceira | 3 > (3 rows) > > teste=# BEGIN; > BEGIN > teste=# update pg_catalog.pg_attribute set attnum = '4' where attname > = 'terceira' and attrelid = '7002157'; -- coloque um numero maior que > o de outras colunas, pois ha' uma constraint > UPDATE 1 > teste=# update pg_catalog.pg_attribute set attnum = '3' where attname > = 'segunda' and attrelid = '7002157'; > UPDATE 1 > teste=# update pg_catalog.pg_attribute set attnum = '2' where attname > = 'terceira' and attrelid = '7002157'; > UPDATE 1 > teste=# commit; > COMMIT > > teste=# \d foobar > Table "pg_temp_1.foobar" > Column | Type | Modifiers > ----------+-----------------------+----------- > id | integer | > terceira | character varying(50) | > segunda | character varying(50) | > _______________________________________________ > pgbr-geral mailing list > [email protected] > <mailto:[email protected]> > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > > > > -- > João Paulo > www.dextra.com.br/postgres <http://www.dextra.com.br/postgres> > PostgreSQL > ------------------------------------------------------------------------ > > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
