INSERT question

From: sarlav kumar <sarlavk(at)yahoo(dot)com>
To: pgsqlperform <pgsql-performance(at)postgresql(dot)org>, pgsql-novice(at)postgresql(dot)org
Subject: INSERT question
Date: 2004-12-13 16:28:39
Message-ID: 20041213162839.60931.qmail@web51303.mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice pgsql-performance

Hi All,

I have a question regarding multiple inserts.
The following function inserts for each country found in country table, values into merchant_buyer_country.

----------------------------------------------------------------------------------------------------------------------------------------
CSQLStatement st( sql );
CSQLStatement st1( sql );
SQLINTEGER rows;
long num_codes = 0;
rows = st.Select( "SELECT * FROM merchant_buyer_country where merchant_id = %lu ",merchant_id );
if ( rows )
return 0;
char code[4];
rows = st.Select( "SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL" );
SQLBindCol( st.hstmt, 1, SQL_C_CHAR, code, sizeof(code), 0 );
long i;
for (i = 0; i < rows; i++ )
{
st.Fetch();
st1.Command("INSERT INTO merchant_buyer_country (merchant_id,country,enabled,group_id) VALUES(%lu ,'%s', true, %lu )", merchant_id,
code,group_id);
}
st.CloseCursor();
st1.CloseCursor();
return 1;
----------------------------------------------------------------------------------------------------------------------------------------

On looking at the log file, I saw separate inserts being performed, and each insert takes about 1 second.

insert into merchant_buyer_country (merchant_id,country,enabled,group_id) values(1203,'IN','true',1);
insert into merchant_buyer_country merchant_id,country,enabled,group_id) values(1203,'US','true',1);
insert into merchant_buyer_country merchant_id,country,enabled,group_id) values (1203,'AR','true',1);
insert into merchant_buyer_country (merchant_id,country,enabled,group_id) values(1203,'AZ','true',1);
insert into merchant_buyer_country merchant_id,country,enabled,group_id) values (1203,'BG','true',1);
insert into merchant_buyer_country merchant_id,country,enabled,group_id) values(1203,'SP','true',1);
.....

There are more than 100 countries and this takes a lot of time for the inserts to complete.
Is there a way to write the INSERT as follows?

INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id) values (1203,
(SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);

I tried this, but I get the following problem:
ERROR: More than one tuple returned by a subselect used as an expression.

I know there is a way to this, but I am not sure where I am going wrong. Can someone please help me figure this out.

Thanks,
Saranya


---------------------------------
Do you Yahoo!?
Meet the all-new My Yahoo! Try it today!

Responses

Browse pgsql-novice by date

  From Date Subject
Next Message Tom Lane 2004-12-13 16:48:14 Re: INSERT question
Previous Message John DeSoi 2004-12-13 13:12:39 Re: basic download and setup questions

Browse pgsql-performance by date

  From Date Subject
Next Message Vivek Khera 2004-12-13 16:33:47 Re: Hardware purchase question
Previous Message Andrew McMillan 2004-12-13 09:56:29 Re: Using LIMIT changes index used by planner