<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cablop.net - Software Tips &#187; tabla</title>
	<atom:link href="http://sw.cablop.net/tips/tag/tabla/feed/" rel="self" type="application/rss+xml" />
	<link>http://sw.cablop.net/tips</link>
	<description>Tips de software, hardware... y algo más</description>
	<lastBuildDate>Fri, 05 Feb 2010 16:50:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Como cambiar el orden de las columnas en PostgreSQL</title>
		<link>http://sw.cablop.net/tips/2009/08/29/como-cambiar-el-orden-de-las-columnas-en-postgresql/</link>
		<comments>http://sw.cablop.net/tips/2009/08/29/como-cambiar-el-orden-de-las-columnas-en-postgresql/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 16:10:19 +0000</pubDate>
		<dc:creator>天龙</dc:creator>
				<category><![CDATA[PostgreSQL 8.3]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[columna]]></category>
		<category><![CDATA[orden]]></category>
		<category><![CDATA[PostgreSQL 8.x]]></category>
		<category><![CDATA[tabla]]></category>

		<guid isPermaLink="false">http://sw.cablop.net/tips/?p=58</guid>
		<description><![CDATA[Este está tomado de la siguiente pregunta en stackoverflow.com: Is it possible to change the natural order of columns in Postgres?.
El procedimiento es simple, aunque no lo recomiendan para usuarios inexpertos o poco cuidadosos. Incluso, debería omitirse esto si no es estrictamente necesario el cambio (las posibilidades de arruinar el sistema son altas). en Eo [...]]]></description>
			<content:encoded><![CDATA[<p>Este está tomado de la siguiente pregunta en <em>stackoverflow.com</em>: <a href="http://stackoverflow.com/questions/126430/is-it-possible-to-change-the-natural-order-of-columns-in-postgres" target="_blank">Is it possible to change the natural order of columns in Postgres?</a>.</p>
<p>El procedimiento es simple, aunque no lo recomiendan para usuarios inexpertos o poco cuidadosos. Incluso, debería omitirse esto si no es estrictamente necesario el cambio (las posibilidades de arruinar el sistema son altas). en Eo personal también lo recomiendo solo si es obligatorio.</p>
<div class="post-text">
<p><strong>Como cambiar el orden de las columnas de una tabla en PostgreSQL</strong></p>
<p><strong>0.</strong> Como base, tenemos una tabla de ejemplo</p>
<pre style="padding-left: 30px"><span style="color: #993300"># CREATE TABLE test (a int, b int, c int);
# INSERT INTO test VALUES (1,2,3);
# SELECT * FROM test;</span>
<span style="color: #808080"> a | b | c
---+---+---
 1 | 2 | 3
(1 row)</span></pre>
<p>Queremos que la columna <em>b</em> quede antes que la columna <em>a</em>.</p>
<p><strong>1.</strong> Nos logeamos en la base de datos con el usuario <em>postgres</em> para poder editar las tablas de sistema.</p>
<p><strong>2.</strong> Buscamos el valor <em>attrelid</em> de la tabla que queremos modificar en la tabla <em>pg_class</em>:</p>
<pre style="padding-left: 30px"><span style="color: #993300"># SELECT relname, relfilenode FROM pg_class WHERE relname='test';</span>
<span style="color: #808080"> relname | relfilenode
---------+-------------
 test_t  |       27666
(1 row)</span></pre>
<p>Luego consultamos la tabla <em>pg_attribute</em> para encontrar la tabla, las columnas y la posición de las columnas, con el valor que nos retornó la búsqueda anterior.</p>
<pre style="padding-left: 30px"><span style="color: #993300"># SELECT attrelid, attname, attnum FROM pg_attribute WHERE attrelid=27666;</span>
<span style="color: #808080"> attrelid | attname  | attnum
----------+----------+--------
    27666 | tableoid |     -7
    27666 | cmax     |     -6
    27666 | xmax     |     -5
    27666 | cmin     |     -4
    27666 | xmin     |     -3
    27666 | ctid     |     -1
    27666 | a        |      1
    27666 | b        |      2
    27666 | c        |      3
(9 rows)</span></pre>
<p>Aquí podemos tener un problema y es que puede que el primer comando no nos retorne nada o nos retorne un valor diferente al que buscamos. De no encontrar la tabla con el primer comando, podemos buscar directamente en la tabla <em>pg_attribute</em> por el nombre de nuestra columna, si este no es común a otras tablas y verificando cuidadosamente que la tabla que buscamos es la que nos interesa.</p>
<pre style="padding-left: 30px"><span style="color: #993300"># SELECT attrelid, attname, attnum FROM pg_attribute WHERE attname=a;
</span><span style="color: #808080"> attrelid | attname  | attnum
----------+----------+--------
    27666 | a        |      1
(1 rows)</span></pre>
<p><strong>3.</strong> Modificamos el valor de attnum de las columnas.</p>
<p>Ya que attnum es una columna de valores únicos (en realidad yo creo que se trata de un constraint compuesto), tenemos que usar un valor temporal mientras modificamos el valor.</p>
<pre style="padding-left: 30px"><span style="color: #993300"># UPDATE pg_attribute SET attnum=4 WHERE attname='a' AND attrelid=27666;</span>
<span style="color: #808080">UPDATE 1</span>
<span style="color: #993300"># UPDATE pg_attribute SET attnum=1 WHERE attname='b' AND attrelid=27666;</span>
<span style="color: #808080">UPDATE 1</span>
<span style="color: #993300"># UPDATE pg_attribute SET attnum=2 WHERE attname='a' AND attrelid=27666;</span>
<span style="color: #808080">UPDATE 1</span></pre>
<p>Luego consultamos la tabla para saber que hicimos las cosas bien</p>
<pre style="padding-left: 30px"><span style="color: #993300"># SELECT * FROM test;</span>
<span style="color: #808080"> b | a | c
---+---+---
 1 | 2 | 3
(1 row)</span></pre>
<p>No sobra recordar que estamos modificando las tablas de sistema, entonces debemos ser muy cuidadosos.</p>
<p>Esto funciona muy bien para PostgreSQL 8.3 (lo tuve que utilizar una sola vez). No sé si para otras versiones, sobre todo las anteriores, el truco también funcione.</p>
<p><strong>Nota.-</strong> El contenido de la página original esta bajo una licencia <a href="http://creativecommons.org/licenses/by-sa/2.5/" target="_blank">Creative Commons Atribución, Compartir Igual</a> y este artículo se ofrece bajo la misma licencia.</div>
]]></content:encoded>
			<wfw:commentRss>http://sw.cablop.net/tips/2009/08/29/como-cambiar-el-orden-de-las-columnas-en-postgresql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
