WL#3129: Consistent clauses in CREATE and DROP
Affects: Server-7.1
—
Status: Un-Assigned
There are clauses or options that apply to some CREATE and DROP statements, but not all. We could be more consistent. The inconsistency ----------------- We're talking about IF EXISTS / IF NOT EXISTS in CREATE and DROP, and about the number of objects that we can drop in one statement. Here, have a chart: Object CREATE IF NOT EXISTS DROP IF EXISTS DROP MANY ------ -------------------- -------------- --------- DATABASE yes yes - EVENT yes yes - FUNCTION - yes - INDEX - - - PROCEDURE - yes - TABLE yes yes yes TRIGGER - yes - USER - - yes VIEW - yes yes SERVER - yes - (as tested 2007-01-10) A "yes" in the "CREATE IF NOT EXISTS" column means CREATE object_type object_name IF NOT EXISTS is legal, e.g. "CREATE DATABASE d IF NOT EXISTS ...". A "yes" in the "DROP IF EXISTS" column means DROP object_type object_name IF EXISTS is legal, e.g. "DROP EVENT IF EXISTS e" A "yes" in the "DROP MANY" column means DROP object_type object_name [, object_name ...] is legal, e.g. "DROP TABLE t1,t2,t3" Other DBMSs ----------- Other DBMSs also lack consistency, although they're unanimous about not using IF EXISTS / IF NOT EXISTS. Here, have another chart: CREATE CREATE DROP DROP IF NOT EXISTS OR REPLACE IF EXISTS many ------------- ------------- --------- ------ Oracle never sometimes [1] never never SQL Server never never never usually [2] DB2 never never never never PostgreSQL never sometimes [3] never sometimes [4] [1] Oracle allows CREATE OR REPLACE for functions, procedures, triggers, views [2] SQL Server allows "DROP name [,name...] for most objects but not users or roles [3] PostgreSQL allows CREATE OR REPLACE for functions and views [4] PostgreSQL allows "DROP name [,name...] for tables, users, views and roles Opinions -------- Re "CREATE IF [NOT] EXISTS": Sergei Golubchik says it "should be supported everywhere". Konstantin Osipov says the "intent" is to support it for triggers. Re "DROP IF EXISTS": Trudy Pelzer says "I like consistency too". Re "DROP MANY": Sergei Golubchik says it should not be encouraged "because of unclear semantics". Konstantin Osipov says: "although it's a very convenient syntax, it's inherently unsafe. I've no strong opinion whether we should support it consistently long-term, especially in the light that all DDL operations are non-transactional." Kristian Koehntopp says the whole thing is "very unsystematic" and we should have a unified way to handle CREATE, DROP, ALTER, and SHOW. Carsten Pedersen asked about "TRUNCATE TABLE IF EXISTS" in an old dev-private thread. A commenter on BUG#15287 suggested that it would be better to support dynamic compound statements, see WL#3696. Materialized Views ------------------ Peter proposed CREATE [OR REPLACE] MATERIALIZED VIEW for WL#2866. During a meeting in Stockholm, it was decided: no, but consider allowing CREATE [or REPLACE] MATERIALIZED VIEW for WL#3129. References ---------- dev-private thread "Create if not exists, Drop if exists, Drop many" https://intranet.mysql.com/secure/mailarchive/mail.php?folder=4&mail=12907 dev-private thread "MySQL - a very unsystematic API" https://intranet.mysql.com/secure/mailarchive/mail.php?folder=4&mail=12963 BUG#2935 "index-level comments" http://bugs.mysql.com/bug.php?id=2935 BUG#15287 "IF EXIST / IF NOT EXIST" http://bugs.mysql.com/bug.php?id=15287 WL#605 "CREATE [OR REPLACE] support" https://intranet.mysql.com/worklog/Server-RawIdeaBin/?tid=605 BUG#18466 add REPLACE to CREATE FUNCTION, PROCEDURE, TRIGGER BUG#19166 DROP USER IF EXISTS BUG#23543 add feature "drop index if exists" BUG#31303 Drop tablespace should support IF EXISTS BUG#4754 'if exists' syntax for rename table BUG#51318 implement "if exists" for DROP LOGFILE GROUP, DROP TABLESPACE commands BUG#61890 truncate if exists
Copyright (c) 2000, 2024, Oracle Corporation and/or its affiliates. All rights reserved.