Thread: RE: Test for existence of Table

RE: Test for existence of Table

From
"Craig L. Ching"
Date:
Yeah,

DROP TABLE employees
CREATE TABLE employees

;-)

Craig

-----Original Message-----
From: Soma Interesting [mailto:dfunct@telus.net]
Sent: Thursday, January 04, 2001 1:40 PM
To: pgsql-general@postgresql.org
Subject: [GENERAL] Test for existence of Table


Can I test for an existing table before issuing the "CREATE TABLE" command?

IF EXISTS employees{
         DROP TABLE employees
}
CREATE TABLE employees

Can you provide an example of this. I couldn't find this in the manual or
Bruce's book - did I not look hard enough ? :)


-          -          -          -          -          -          -
  -          -          -          -
WARNING: Some experts believe that use of any keyboard may cause
serious injury. Consult Users Guide.

dfunct@telus.net

Re: Test for existence of Table

From
"Gregory Wood"
Date:
> DROP TABLE employees
Error: ERROR:  Relation 'employees' does not exist

And execution halts.... which is I believe why he wanted to check for the
existence before trying to DROP. I'd love to know if this exists as well...
would come in very handy during development time.

Greg

> Yeah,
>
> DROP TABLE employees
> CREATE TABLE employees
>
> ;-)
>
> Craig
>
> -----Original Message-----
> From: Soma Interesting [mailto:dfunct@telus.net]
> Sent: Thursday, January 04, 2001 1:40 PM
> To: pgsql-general@postgresql.org
> Subject: [GENERAL] Test for existence of Table
>
>
> Can I test for an existing table before issuing the "CREATE TABLE"
command?
>
> IF EXISTS employees{
>          DROP TABLE employees
> }
> CREATE TABLE employees
>
> Can you provide an example of this. I couldn't find this in the manual or
> Bruce's book - did I not look hard enough ? :)
>
>
> -          -          -          -          -          -          -
>   -          -          -          -
> WARNING: Some experts believe that use of any keyboard may cause
> serious injury. Consult Users Guide.
>
> dfunct@telus.net
>


Re: Test for existence of Table

From
"Anthony E . Greene"
Date:
On Thu, 04 Jan 2001 22:11:31 Gregory Wood wrote:
>> DROP TABLE employees
>Error: ERROR:  Relation 'employees' does not exist
>
>And execution halts.... which is I believe why he wanted to check for the
>existence before trying to DROP. I'd love to know if this exists as well...
>would come in very handy during development time.
>
>Greg

I just tested this with "psql < script.sql" and execution did not stop.
There may be contexts where this error causes execution to stop but it works
at the command line with psql. That implies that it works within psql using
"\i script.sql", which I have also found to be true.

Tony
--
Anthony E. Greene <agreene@pobox.com> <http://www.pobox.com/~agreene/>
PGP Key: 0x6C94239D/7B3D BD7D 7D91 1B44 BA26  C484 A42A 60DD 6C94 239D
Chat:  AOL/Yahoo: TonyG05    ICQ: 91183266
Linux. The choice of a GNU Generation. <http://www.linux.org/>

RE: Re: Test for existence of Table

From
"Craig L. Ching"
Date:
>-----Original Message-----
>From: Gregory Wood [mailto:gregw@com-stock.com]
>Sent: Thursday, January 04, 2001 9:12 PM
>To: PostgreSQL-General
>Subject: [GENERAL] Re: Test for existence of Table
>
>
>> DROP TABLE employees
>Error: ERROR:  Relation 'employees' does not exist
>
>And execution halts.... which is I believe why he wanted to check for the
>existence before trying to DROP. I'd love to know if this exists as well...
>would come in very handy during development time.
>

Execution does not halt, it continues and creates the table.  I rely on this
functionality, so I know it works.  Good luck!

>
>Greg

Cheers,
Craig

Re: Re: Test for existence of Table

From
"Gregory Wood"
Date:
> >> DROP TABLE employees
> >Error: ERROR:  Relation 'employees' does not exist
> >
> >And execution halts.... which is I believe why he wanted to check for the
> >existence before trying to DROP. I'd love to know if this exists as
well...
> >would come in very handy during development time.
>
> Execution does not halt, it continues and creates the table.  I rely on
this
> functionality, so I know it works.  Good luck!

Well, that is a quote from the database tool I use, and execution does
indeed halt. I can only assume you are using psql, which someone confirmed
that that does work. Also, if you wrap your queries in an explicit
transaction (I don't like to leave anything to Auto-Commit), it will also
fail:

NOTICE:  current transaction is aborted, queries ignored until end of
transaction block

What would be nice is if there were a way to only DROP a table if it exists.
But I would consider this to be rather low priority.

Greg


Re: Re: Re: Test for existence of Table

From
Ed Loehr
Date:
Gregory Wood wrote:
>
> What would be nice is if there were a way to only DROP a table if it exists.
> But I would consider this to be rather low priority.

This might help...

CREATE FUNCTION table_exists(TEXT) RETURNS BOOLEAN AS
'DECLARE
        tablename ALIAS FOR $1;
        temp RECORD;
BEGIN
    SELECT INTO temp *
    FROM pg_class c
    WHERE c.relname = tablename
      AND c.relkind = ''r'';

    if found then
        return ''t''::BOOLEAN;
    else
        return ''f''::BOOLEAN;
    end if;
END;'
LANGUAGE 'plpgsql';

-- test table
CREATE TABLE realtable (id INTEGER);

-- test example
SELECT table_exists('realtable'::TEXT);
SELECT table_exists('faketable'::TEXT);

-- clean up
DROP TABLE realtable;
DROP FUNCTION table_exists(TEXT);

It'd be even nicer if you could drop the table from within the PL/pgSQL
function, but I found that does not work in 7.0.0.