drop if exists
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
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!
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)
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.
--
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
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
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
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.
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
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
--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
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
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 !