Re: insert into test_b (select * from test_a) with different column order

From: Leif Biberg Kristensen <leif(at)solumslekt(dot)org>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: insert into test_b (select * from test_a) with different column order
Date: 2010-03-29 15:09:25
Message-ID: 201003291709.26101.leif@solumslekt.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Monday 29. March 2010 16.51.35 Ole Tange wrote:
> I have 2 tables that have the same column names but in different
> order. Similar to this:
>
> create table test_a (col_a text, col_b int);
> create table test_b (col_b int, col_a text);
> insert into test_a values ('abc', 2),( 'def', 3);
>
> I would like to do this:
>
> insert into test_b (select * from test_a);
>
> This fails because the columns in test_b are not in the same order as
> test_a. For my use case the tables may get more columns or have
> columns removed over time og be recreated in a different order, the
> only thing that is given is that the column names in test_a and test_b
> always are the same and that the datatype of the named columns are the
> same.
>
> Is there a general solution I can use to do the insert?

Per the SQL standard, there's no inherent order between columns. That said,
you'll usually get the columns in the order that they were created, but
there's no guarantee for it. Actually, when you do a SELECT * FROM ... you
make a totally unwarranted assumption that the columns will come out in any
specific order. So, the answer to your question is to specify the columns
explicitly in your query, as

insert into test_b (select col_b, col_a from test_a);

regards,
--
Leif Biberg Kristensen
http://solumslekt.org/

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Andrus 2010-03-29 15:12:39 Re: Splitting text column to multiple rows
Previous Message Andrus 2010-03-29 15:08:15 Re: Splitting text column to multiple rows