INSERT question

Lists: pgsql-novicepgsql-performance
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
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!


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: sarlav kumar <sarlavk(at)yahoo(dot)com>
Cc: pgsql-novice(at)postgresql(dot)org
Subject: Re: INSERT question
Date: 2004-12-13 16:48:14
Message-ID: 25641.1102956494@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-novice pgsql-performance

sarlav kumar <sarlavk(at)yahoo(dot)com> writes:
> 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.

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

regards, tom lane


From: Bruno Wolff III <bruno(at)wolff(dot)to>
To: sarlav kumar <sarlavk(at)yahoo(dot)com>
Cc: pgsqlperform <pgsql-performance(at)postgresql(dot)org>, pgsql-novice(at)postgresql(dot)org
Subject: Re: INSERT question
Date: 2004-12-13 16:49:52
Message-ID: 20041213164952.GC546@wolff.to
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-novice pgsql-performance

On Mon, Dec 13, 2004 at 08:28:39 -0800,
sarlav kumar <sarlavk(at)yahoo(dot)com> wrote:
>
> 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);
>

You have to use a SELECT instead of the VAlues clause. Something like the
following should work:
INSERT INTO merchant_buyer_country (merchant_id, country, enabled, group_id)
SELECT 1203, code, TRUE, 1 FROM country
WHERE send IS NOT NULL OR receive IS NOT NULL
;


From: sarlav kumar <sarlavk(at)yahoo(dot)com>
To: pgsql-novice(at)postgresql(dot)org
Subject: Re: INSERT question
Date: 2004-12-13 18:31:13
Message-ID: 20041213183113.58578.qmail@web51310.mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-novice pgsql-performance

Thanks!! that worked!:)

Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:sarlav kumar writes:
> 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.

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

regards, tom lane

__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com


From: sarlav kumar <sarlavk(at)yahoo(dot)com>
To: pgsqlperform <pgsql-performance(at)postgresql(dot)org>
Subject: Re: INSERT question
Date: 2004-12-13 18:33:08
Message-ID: 20041213183308.68580.qmail@web51307.mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-novice pgsql-performance

Thanks guys!! that worked!:)

Michael Adler <adler(at)pobox(dot)com> wrote:
On Mon, Dec 13, 2004 at 08:28:39AM -0800, sarlav kumar wrote:
> 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.

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

-Mike Adler

Bruno Wolff III <bruno(at)wolff(dot)to> wrote:
On Mon, Dec 13, 2004 at 08:28:39 -0800,
sarlav kumar wrote:
>
> 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);
>

You have to use a SELECT instead of the VAlues clause. Something like the
following should work:
INSERT INTO merchant_buyer_country (merchant_id, country, enabled, group_id)
SELECT 1203, code, TRUE, 1 FROM country
WHERE send IS NOT NULL OR receive IS NOT NULL
;

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to majordomo(at)postgresql(dot)org


---------------------------------
Do you Yahoo!?
All your favorites on one personal page Try My Yahoo!


From: george young <gry(at)ll(dot)mit(dot)edu>
To: sarlav kumar <sarlavk(at)yahoo(dot)com>
Cc: pgsql-novice(at)postgresql(dot)org
Subject: Re: [PERFORM] INSERT question
Date: 2004-12-29 18:58:58
Message-ID: 20041229135858.71f8c3cf.gry@ll.mit.edu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-novice pgsql-performance

On Mon, 13 Dec 2004 08:28:39 -0800 (PST)
sarlav kumar <sarlavk(at)yahoo(dot)com> threw this fish to the penguins:

> 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.

Try:

insert into merchant_buyer_country select 1203,code,true,1 from country where send is not null or receive is not null;

-- George Young
--
"Are the gods not just?" "Oh no, child.
What would become of us if they were?" (CSL)