drop if exists

Started by Andrew Dunstanabout 20 years ago13 messages
#1Andrew Dunstan
andrew@dunslane.net

From time to time the suggestion crops up of allowing a DROP IF EXISTS
... syntax. This seems not unreasonable, and I just spent a few minutes
looking at what might be involved. Especially in the case of a table,
view, sequence and index the changes look like they would be very modest
indeed, and not enormously greater in the case of a type, domain,
conversion and schema.

Is this worth doing? Would it be acceptable?

cheers

andrew

#2David Fetter
david@fetter.org
In reply to: Andrew Dunstan (#1)
Re: drop if exists

On Fri, Oct 14, 2005 at 08:29:43PM -0400, Andrew Dunstan wrote:

From time to time the suggestion crops up of allowing a DROP IF
EXISTS ... syntax. This seems not unreasonable, and I just spent a
few minutes looking at what might be involved. Especially in the
case of a table, view, sequence and index the changes look like they
would be very modest indeed, and not enormously greater in the case
of a type, domain, conversion and schema.

Is this worth doing? Would it be acceptable?

Yes, and yes, in my case :)

Cheers,
D
--
David Fetter david@fetter.org http://fetter.org/
phone: +1 510 893 6100 mobile: +1 415 235 3778

Remember to vote!

#3Alvaro Herrera
alvherre@alvh.no-ip.org
In reply to: Andrew Dunstan (#1)
Re: drop if exists

Andrew Dunstan wrote:

From time to time the suggestion crops up of allowing a DROP IF EXISTS
... syntax. This seems not unreasonable, and I just spent a few minutes
looking at what might be involved.

What about "CREATE IF NOT EXISTS" (CINE)? If we support DROP IF EXISTS
(DIE), is the other one going to be supported too?

How does this play with schemas? I assume DIE drops the table in any
schema in the search path. What if there's more than one; drop the
first one? CINE creates the schema in the first schema in the path,
just like CREATE.

Also, DIE does not need to lock the table afterwards because it won't
exist, but CINE needs to keep a lock until transaction commit.

--
Alvaro Herrera http://www.amazon.com/gp/registry/DXLWNGRJD34
"Ninguna manada de bestias tiene una voz tan horrible como la humana" (Orual)

#4Rod Taylor
pg@rbt.ca
In reply to: Andrew Dunstan (#1)
Re: drop if exists

On Fri, 2005-10-14 at 20:29 -0400, Andrew Dunstan wrote:

From time to time the suggestion crops up of allowing a DROP IF EXISTS
... syntax. This seems not unreasonable, and I just spent a few minutes
looking at what might be involved. Especially in the case of a table,
view, sequence and index the changes look like they would be very modest
indeed, and not enormously greater in the case of a type, domain,
conversion and schema.

I would rather have a 'rollback or release savepoint' command which
would rollback to the savepoint if there was an error or release it
otherwise.

This way any command or combination of commands could be aborted or
continued as a group in a statically defined script.

--

#5Jari Aalto
jari.aalto@cante.net
In reply to: Andrew Dunstan (#1)
Re: drop if exists

Alvaro Herrera <alvherre@alvh.no-ip.org> writes:

Andrew Dunstan wrote:

| >
| > From time to time the suggestion crops up of allowing a DROP IF EXISTS
| > ... syntax. This seems not unreasonable, and I just spent a few minutes
| > looking at what might be involved.

What about "CREATE IF NOT EXISTS" (CINE)? If we support DROP IF EXISTS
(DIE), is the other one going to be supported too?

How does this play with schemas? I assume DIE drops the table in any
schema in the search path. What if there's more than one; drop the
first one? CINE creates the schema in the first schema in the path,
just like CREATE.

Also, DIE does not need to lock the table afterwards because it won't
exist, but CINE needs to keep a lock until transaction commit.

The "DROP IF EXISTS" is usually used in database creation scripts in
order to rebuild contents of schema. The parallel "CREATE IF EXISTS"
does not sound as useful feature.

DROP ... that table
CREATE ... that table

DROP ... that index
CREATE ... that index

etc.

It would also be MySQL compatible if DROP IF EXISTS were implemented.

Jari

#6Andrew Dunstan
andrew@dunslane.net
In reply to: Rod Taylor (#4)
Re: drop if exists

Rod Taylor wrote:

On Fri, 2005-10-14 at 20:29 -0400, Andrew Dunstan wrote:

From time to time the suggestion crops up of allowing a DROP IF EXISTS
... syntax. This seems not unreasonable, and I just spent a few minutes
looking at what might be involved. Especially in the case of a table,
view, sequence and index the changes look like they would be very modest
indeed, and not enormously greater in the case of a type, domain,
conversion and schema.

I would rather have a 'rollback or release savepoint' command which
would rollback to the savepoint if there was an error or release it
otherwise.

This way any command or combination of commands could be aborted or
continued as a group in a statically defined script.

I don't see that they are mutually exclusive, although one could achieve
the effect this way.

cheers

andrew

#7Andrew Dunstan
andrew@dunslane.net
In reply to: Alvaro Herrera (#3)
Re: drop if exists

Alvaro Herrera wrote:

Andrew Dunstan wrote:

From time to time the suggestion crops up of allowing a DROP IF EXISTS
... syntax. This seems not unreasonable, and I just spent a few minutes
looking at what might be involved.

What about "CREATE IF NOT EXISTS" (CINE)? If we support DROP IF EXISTS
(DIE), is the other one going to be supported too?

Maybe. But I am not sure they need to be done together.

How does this play with schemas? I assume DIE drops the table in any
schema in the search path. What if there's more than one; drop the
first one?

Yes. Just like now. My idea was that at the point where it currently
errors out because the object exists, we would instead simply fall
through and take no action.

CINE creates the schema in the first schema in the path,
just like CREATE.

Also, DIE does not need to lock the table afterwards because it won't
exist, but CINE needs to keep a lock until transaction commit.

Right. That's one reason I thought of starting with the DIE case ;-)

cheers

andrew

#8Martijn van Oosterhout
kleptog@svana.org
In reply to: Alvaro Herrera (#3)
Re: drop if exists

On Fri, Oct 14, 2005 at 10:32:02PM -0300, Alvaro Herrera wrote:

What about "CREATE IF NOT EXISTS" (CINE)? If we support DROP IF EXISTS
(DIE), is the other one going to be supported too?

CINE already exists sortof, it's called CREATE OR REPLACE. Although the
effect is obvious for functions, it seems to me that it would be cool
to make a CREATE OR REPLACE TABLE that simply does nothing if the table
already exists with the right format.

ISTM that most of the sitautions people are talking about here ivolving
recreating the table exactly as is directly afterwards.
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

Show quoted text

Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a
tool for doing 5% of the work and then sitting around waiting for someone
else to do the other 95% so you can sue them.

#9Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#6)
Re: drop if exists

Andrew Dunstan <andrew@dunslane.net> writes:

Rod Taylor wrote:

I would rather have a 'rollback or release savepoint' command which
would rollback to the savepoint if there was an error or release it
otherwise.

This way any command or combination of commands could be aborted or
continued as a group in a statically defined script.

I don't see that they are mutually exclusive, although one could achieve
the effect this way.

For single-command transactions, you don't actually need either one.
Ignoring the error message from the failed DROP works fine.

If you're trying to wrap the creation of a whole schema in an outer
transaction, though, you need one or the other --- and Rod's suggestion
is definitely more flexible.

I think the main argument in favor of DROP IF EXISTS is that people
coming from MySQL are accustomed to having it.

regards, tom lane

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#7)
Re: drop if exists

Andrew Dunstan <andrew@dunslane.net> writes:

Alvaro Herrera wrote:

Also, DIE does not need to lock the table afterwards because it won't
exist, but CINE needs to keep a lock until transaction commit.

Right. That's one reason I thought of starting with the DIE case ;-)

That argument seems pretty wrongheaded to me --- if there was a table
and DIE dropped it, you *will* be holding a lock until commit. DROP
can be rolled back, remember? CINE will need to keep a lock too, at
least in the cases where it creates or modifies the table, though you
could possibly choose to drop the lock immediately if there's no change.

I don't see any real use for CINE --- it's too nonintuitive about what
will happen. Does it adjust the table definition to match if different?
Does it truncate away the data inside the table (it certainly must if it
changes the table definition)? If so, what about foreign keys? The
implication of that command name is that nothing happens if the table
exists, regardless of definition or contents. Which seems a pretty
useless behavior.

We know that DIE is a convenient, useful semantics because people keep
asking for it. I think CINE has no track record.

regards, tom lane

#11Bernd Helmle
mailings@oopsware.de
In reply to: Martijn van Oosterhout (#8)
Re: drop if exists

--On Samstag, Oktober 15, 2005 17:20:06 +0200 Martijn van Oosterhout
<kleptog@svana.org> wrote:

Although the
effect is obvious for functions, it seems to me that it would be cool
to make a CREATE OR REPLACE TABLE that simply does nothing if the table
already exists with the right format.

Hmm i don't think this is the right semantic, because CREATE OR REPLACE for
other objects does indeed something, simply ignoring an existing object
isn't what i would expect.

--
Thanks

Bernd

#12Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#10)
Re: drop if exists

Tom Lane wrote:

We know that DIE is a convenient, useful semantics because people keep
asking for it. I think CINE has no track record.

You have confirmed my initial instinct. I will get this done for 8.2.

cheers

andrew

#13Darko Prenosil
Darko.Prenosil@inet.hr
In reply to: Andrew Dunstan (#7)
Re: drop if exists

Andrew Dunstan wrote:

Alvaro Herrera wrote:

Andrew Dunstan wrote:

From time to time the suggestion crops up of allowing a DROP IF
EXISTS ... syntax. This seems not unreasonable, and I just spent a
few minutes looking at what might be involved.

What about "CREATE IF NOT EXISTS" (CINE)? If we support DROP IF EXISTS
(DIE), is the other one going to be supported too?

Maybe. But I am not sure they need to be done together.

How does this play with schemas? I assume DIE drops the table in any
schema in the search path. What if there's more than one; drop the
first one?

Yes. Just like now. My idea was that at the point where it currently
errors out because the object exists, we would instead simply fall
through and take no action.

CINE creates the schema in the first schema in the path,
just like CREATE.

Also, DIE does not need to lock the table afterwards because it won't
exist, but CINE needs to keep a lock until transaction commit.

Right. That's one reason I thought of starting with the DIE case ;-)

cheers

andrew

In real world scenarios having "CREATE IF NOT EXISTS" or "drop if
exists" on basic objects is just not enough.
I'll try to explain:

when writing sql scripts for "database upgrade", I very often have this
case:

1. check if object exists at all, if not, create it
2. Check if table is of the last version (does it have all required fields)
3. If table is older version, then create new fields, constraints etc...
4. Sometimes even I have to do something with the data or table
structure depending on
some database setting (data from my settings table)
etc...

So, if only tables, functions and other base objects are supported by
new syntax, I'll still
have to write temporary functions or use pgbash (like I do now).
The really good thing would be to have implemented "IF" statement in
general, but I understand that this is
not a trivial task at all.

Just my two cents..

Regards !