云服务器内容精选

  • 参数说明 IF EXISTS 如果指定的节点不存在,则发出一个notice而不是抛出一个错误。 nodename 要删除的节点名。 取值范围:已存在的节点nodename。 cnnodename CN名称。如果定义了该参数,则删除当前连接CN下的集群节点以及所定义CN下的集群节点。 取值范围:已存在的CN的nodename。 多CN环境下,创建集群节点时只会在当前连接的CN下创建,不会同步至其他CN,需要在所有CN上执行创建操作,如果删除集群节点只需要链接一个CN即可。如果只在其中一个CN执行创建了集群节点,要删除需要定义当前cnnodename,并在此CN下执行删除操作。
  • 注意事项 只有数据库所有者或者被授予了数据库DROP权限的用户有权限执行DROP DATABASE命令,系统管理员默认拥有此权限。 不能对系统默认安装的四个数据库(POSTGRES、TEMPLATE0、TEMPLATE1和TEMPLATEA)执行删除操作,系统做了保护。如果想查看当前服务中有哪几个数据库,可以用gsql的\l命令查看。 如果有用户正在与要删除的数据库连接,则删除操作失败。可以通过视图DV_SESSIONS查看当前有哪些数据库连接。 不能在事务块中执行DROP DATABASE命令。 如果执行DROP DATABASE失败,事务回滚,需要再次执行一次DROP DATABASE IF EXISTS。 DROP DATABASE一旦执行将无法撤销,请谨慎使用。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 --创建用户webuser。 gaussdb=# CREATE USER webuser PASSWORD '********'; --授予用户webuser对模式tpcds下视图的所有操作权限。 gaussdb=# DO $$DECLARE r record; BEGIN FOR r IN SELECT c.relname,n.nspname FROM pg_class c,pg_namespace n WHERE c.relnamespace = n.oid AND n.nspname = 'tpcds' AND relkind IN ('r','v') LOOP EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser'; END LOOP; END$$; --删除用户webuser。 gaussdb=# DROP USER webuser CASCADE;
  • 注意事项 须使用CASCADE级联删除依赖用户的对象(除数据库外)。当删除用户的级联对象时,如果级联对象处于锁定状态,则此级联对象无法被删除,直到对象被解锁或锁定级联对象的线程被终止。 在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即DROP USER不支持跨数据库进行级联删除。 在删除用户时,需要先删除该用户拥有的所有对象并且收回该用户在其他对象上的权限,或者通过指定CASCADE级联删除该用户拥有的对象和被授予的权限。 在多租户场景下,删除组用户时,业务用户也会同时被删除,如果指定CASCADE级联删除,那么删除业务用户时同时也指定CASCADE。如果在删除某个用户失败时,会报错,同时其他用户也无法成功删除。 如果用户下存在创建GDS外表时指定的错误表,则无法通过DROP USER指定CASCADE关键字直接删除用户。
  • 示例 --创建用户jim,登录密码为********。 gaussdb=# CREATE USER jim PASSWORD '********'; --删除不存在的tom用户。 gaussdb=# DROP USER IF EXISTS tom; NOTICE: role "tom" does not exist, skipping DROP ROLE --删除用户。 gaussdb=# DROP USER jim CASCADE;
  • 参数说明 IF EXISTS 使用该参数时,如果指定的用户不存在,发出一个notice而不是抛出一个错误,故使用该参数可以避免出现报错。 user_name 待删除的用户名。 取值范围:数据库中已存在的用户名。 CASCADE | RESTRICT CASCADE:级联删除依赖用户的对象,并收回授予该用户的权限。 RESTRICT:如果用户还有任何依赖的对象或被授予了其他对象的权限,则拒绝删除该用户(缺省行为)。 在 GaussDB 中,存在一个配置参数enable_kill_query,此参数在配置文件gaussdb.conf中。此参数影响级联删除用户对象的行为: 当参数enable_kill_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的线程,并删除用户。 当参数enable_kill_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的线程结束之后再删除用户。
  • 示例 --创建源表及触发表。 gaussdb=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); gaussdb=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); INSERT触发器的使用。 --创建insert触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END $$ LANGUAGE plpgsql; --创建INSERT触发器。 gaussdb=# CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func(); --执行INSERT触发事件并检查触发结果。 gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) 匿名块和OR REPLACE语法创建触发器。 --使用匿名块语法创建INSERT触发器。 gaussdb=# CREATE TRIGGER insert_trigger_with_anonyblock BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END; / --使用OR REPLACE语法创建INSERT触发器。 gaussdb=# CREATE OR REPLACE TRIGGER insert_trigger_with_anonyblock BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END; / --删除触发器。 gaussdb=# DROP TRIGGER insert_trigger_with_anonyblock ON test_trigger_src_tbl; -- 会将隐式创建的函数insert_trigger_with_anonyblock一起删除 UPDATE触发器的使用。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 --创建UPDATE触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS $$ DECLARE BEGIN UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; --创建UPDATE触发器。 gaussdb=# CREATE TRIGGER update_trigger AFTER UPDATE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_update_func(); --执行UPDATE触发事件并检查触发结果。 gaussdb=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) DELETE触发器的使用。 --创建DELETE触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS $$ DECLARE BEGIN DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; --创建DELETE触发器。 gaussdb=# CREATE TRIGGER delete_trigger BEFORE DELETE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_delete_func(); --执行DELETE触发事件并检查触发结果。 gaussdb=# DELETE FROM test_trigger_src_tbl WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- (0 rows) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- (0 rows) 修改触发器名称。 1 2 --修改触发器的名称。 gaussdb=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; 禁用触发器。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 --禁用insert_trigger触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //可以看到触发器没有生效。 id1 | id2 | id3 -----+-----+----- (0 rows) --禁用当前表上所有触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; 删除触发器。 1 2 3 4 5 gaussdb=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER update_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl; 删除函数。 1 2 3 4 5 gaussdb=# DROP FUNCTION tri_insert_func; gaussdb=# DROP FUNCTION tri_update_func; gaussdb=# DROP FUNCTION tri_delete_func; 1 2 3 --删除源表及触发表。 gaussdb=# DROP TABLE test_trigger_src_tbl; gaussdb=# DROP TABLE test_trigger_des_tbl;
  • 参数说明 IF EXISTS 如果指定的触发器不存在,则发出一个notice而不是抛出一个错误。 trigger_name 要删除的触发器名称。 取值范围:已存在的触发器。 table_name 要删除的触发器所在的表名称。 取值范围:已存在的含触发器的表。 CASCADE | RESTRICT CASCADE:级联删除依赖此触发器的对象。 RESTRICT:如果有依赖对象存在,则拒绝删除此触发器。此选项为缺省值。
  • 示例 --创建表。 gaussdb=# CREATE TABLE my_table (c1 int, c2 int) WITH(STORAGE_TYPE=ASTORE); --创建名为my_mv的物化视图。 gaussdb=# CREATE MATERIALIZED VIEW my_mv AS SELECT * FROM my_table; --删除名为my_mv的物化视图。 gaussdb=# DROP MATERIALIZED VIEW my_mv; --删除表。 gaussdb=# DROP TABLE my_table;
  • 示例 1 2 3 4 5 6 7 8 9 --创建安全标签sec_label。 gaussdb=# CREATE SECURITY LABEL sec_label 'L1:G4'; --删除不存在的安全标签sec_label2。 gaussdb=# DROP SECURITY LABEL sec_label2; ERROR: security label "sec_label2" does not exist --删除已存在的安全标签sec_label。 gaussdb=# DROP SECURITY LABEL sec_label;
  • 示例 删除部分数据 --建表。 gaussdb=# CREATE TABLE test_t1(col1 INT,col2 INT); gaussdb=# INSERT INTO test_t1 VALUES (1, 1), (2, 2), (3, 3), (4, 4), (4, 6); --删除表中部分记录。 gaussdb=# DELETE FROM test_t1 WHERE col1 = 4; --查询。 gaussdb=# SELECT * FROM test_t1; col1 | col2 ------+------ 1 | 1 2 | 2 3 | 3 (3 rows) 删除所有数据 --删除所有的数据。 gaussdb=# DELETE FROM test_t1; --查询。 gaussdb=# SELECT * FROM test_t1; col1 | col2 ------+------ (0 rows) --删除表。 gaussdb=# DROP TABLE test_t1; WITH [ RECURSIVE ] with_query [, ...] --创建学生表。 gaussdb=# CREATE TABLE student(id INT,name varchar(50)); --创建成绩表。 gaussdb=# CREATE TABLE grade(id INT,score CHAR); gaussdb=# INSERT INTO student VALUES (1, 'tom'), (2, 'jerry'), (3, 'david'); gaussdb=# INSERT INTO grade VALUES (1, 'A'), (2, 'B'), (3, 'b'); --在学生表中删除id=2的数据同时删除该学生在成绩表中的数据。 gaussdb=# WITH del_stu AS(DELETE FROM student WHERE id = 2 RETURNING id) DELETE FROM grade WHERE id = (SELECT id FROM del_stu); --查询数据。 gaussdb=# SELECT * FROM student; id | name ----+------- 1 | tom 3 | david (2 rows) gaussdb=# SELECT * FROM grade; id | score ----+------- 1 | A 3 | b (2 rows) --删除表。 gaussdb=# DROP TABLE grade; gaussdb=# DROP TABLE student; 删除视图或子查询 示例1:删除子查询 --创建SCHEMA。 gaussdb=# CREATE SCHEMA del_subqry; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = 'del_subqry'; SET --创建表并插入数据。 gaussdb=# CREATE TABLE t1 (x1 int, y1 int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'x1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# CREATE TABLE t2 (x2 int PRIMARY KEY, y2 int); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t2_pkey" for table "t2" CREATE TABLE gaussdb=# CREATE TABLE tdata (x INT PRIMARY KEY, y INT); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tdata_pkey" for table "tdata" CREATE TABLE gaussdb=# CREATE TABLE tinfo (z INT PRIMARY KEY, comm VARCHAR2(20)); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tinfo_pkey" for table "tinfo" CREATE TABLE gaussdb=# INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (5, 5); INSERT 0 4 gaussdb=# INSERT INTO t2 VALUES (1, 1), (2, 2), (3, 3), (5, 5); INSERT 0 4 gaussdb=# INSERT INTO tdata VALUES (1, 1), (2, 2), (3, 3); INSERT 0 3 gaussdb=# INSERT INTO tinfo VALUES (1,'one'), (2, 'two'), (3, 'three'), (5, 'wrong three'); INSERT 0 4 --通过子查询删除t1中的数据。 gaussdb=# DELETE FROM (SELECT * FROM t1) where y1 = 3; DELETE 1 --子查询带READ ONLY,无法删除数据。 gaussdb=# DELETE FROM (SELECT * FROM t1 WITH READ ONLY) WHERE y1 = 1; ERROR: cannot perform a DML operation on a read-only subquery. --对多表连接的子查询删除。 gaussdb=# SELECT * FROM t1, t2 WHERE x1 = x2; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 2 | 2 | 2 | 2 5 | 5 | 5 | 5 (3 rows) gaussdb=# DELETE FROM (SELECT * FROM t1, t2 WHERE x1 = x2) WHERE y2 = 5; DELETE 1 gaussdb=# SELECT * FROM t1, t2 WHERE x1 = x2; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 2 | 2 | 2 | 2 (2 rows) --子查询带CHECK OPTION,tdata表重复,其中 td1不是保留键表,td2是保留键表。 gaussdb=# DELETE FROM (SELECT td1.x x1, td1.y y1, td2.x x2, td2.y y2 FROM tdata td1, tdata td2, tinfo WHERE td2.y=tinfo.z AND td1.x=td2.y WITH CHECK OPTION) WHERE y1 = 2; ERROR: cannot delete from view without exactly one key-preserved table --不带CHECK OPTION,创建同样结构的子查询,删除成功。 gaussdb=# DELETE FROM (SELECT td1.x x1, td1.y y1, td2.x x2, td2.y y2 FROM tdata td1, tdata td2, tinfo WHERE td2.y=tinfo.z AND td1.x=td2.y) WHERE y1 = 2; DELETE 1 --删除SCHEMA。 gaussdb=# RESET CURRENT_SCHEMA; RESET gaussdb=# DROP SCHEMA del_subqry CASCADE; NOTICE: drop cascades to 5 other objects DETAIL: drop cascades to table del_subqry.t1 drop cascades to table del_subqry.t2 drop cascades to table del_subqry.tdata drop cascades to table del_subqry.tinfo drop cascades to view del_subqry.vv_wco DROP SCHEMA 示例2: 删除视图 --创建SCHEMA。 gaussdb=# CREATE SCHEMA del_view; CREATE SCHEMA。 gaussdb=# SET CURRENT_SCHEMA = 'del_view'; SET --创建表并插入数据。 gaussdb=# CREATE TABLE t1 (x1 int, y1 int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'x1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# CREATE TABLE t2 (x2 int PRIMARY KEY, y2 int); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t2_pkey" for table "t2" CREATE TABLE gaussdb=# CREATE TABLE tdata (x INT PRIMARY KEY, y INT); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tdata_pkey" for table "tdata" CREATE TABLE gaussdb=# CREATE TABLE tinfo (z INT PRIMARY KEY, comm VARCHAR2(20)); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tinfo_pkey" for table "tinfo" CREATE TABLE gaussdb=# INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (5, 5); INSERT 0 4 gaussdb=# INSERT INTO t2 VALUES (1, 1), (2, 2), (3, 3), (5, 5); INSERT 0 4 gaussdb=# INSERT INTO tdata VALUES (1, 1), (2, 2), (3, 3); INSERT 0 3 gaussdb=# INSERT INTO tinfo VALUES (1,'one'), (2, 'two'), (3, 'three'), (5, 'wrong three'); INSERT 0 4 --创建单表视图。 gaussdb=# CREATE VIEW v_del1 AS SELECT * FROM t1; CREATE VIEW gaussdb=# CREATE VIEW v_del_read AS SELECT * FROM t1 WITH READ ONLY; CREATE VIEW --通过视图删除t1中的数据。 gaussdb=# DELETE FROM v_del1 where y1 = 3; DELETE 1 --视图带READ ONLY,无法删除数据。 gaussdb=# DELETE FROM v_del_read WHERE y1 = 1; ERROR: cannot perform a DML operation on a read-only subquery. --创建多表连接视图。 gaussdb=# CREATE VIEW vvt1t2 AS SELECT * FROM t1, t2 WHERE x1 = x2; CREATE VIEW gaussdb=# CREATE VIEW vv_dup AS SELECT td1.x x1, td1.y y1, td2.x x2, td2.y y2 FROM tdata td1, tdata td2, tinfo WHERE td2.y=tinfo.z AND td1.x=td2.y; CREATE VIEW gaussdb=# CREATE VIEW vv_dup_wco AS SELECT td1.x x1, td1.y y1, td2.x x2, td2.y y2 FROM tdata td1, tdata td2, tinfo WHERE td2.y=tinfo.z AND td1.x=td2.y WITH CHECK OPTION; CREATE VIEW --对多表连接的视图做删除操作。 gaussdb=# SELECT * FROM vvt1t2; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 2 | 2 | 2 | 2 5 | 5 | 5 | 5 (3 rows) gaussdb=# DELETE FROM vvt1t2 WHERE y2 = 5; DELETE 1 gaussdb=# SELECT * FROM vvt1t2; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 2 | 2 | 2 | 2 (2 rows) --视图带CHECK OPTION,tdata表重复,其中 td1不是保留键表,td2是保留键表。 gaussdb=# DELETE FROM vv_dup_wco WHERE y1 = 2; ERROR: cannot delete from view without exactly one key-preserved table --不带CHECK OPTION,创建同样结构的视图,删除成功。 gaussdb=# DELETE FROM vv_dup WHERE y1 = 2; DELETE 1 --删除SCHEMA。 gaussdb=# RESET CURRENT_SCHEMA; RESET gaussdb=# DROP SCHEMA del_view CASCADE; NOTICE: drop cascades to 9 other objects DETAIL: drop cascades to table del_view.t1 drop cascades to table del_view.t2 drop cascades to table del_view.tdata drop cascades to table del_view.tinfo drop cascades to view del_view.v_del1 drop cascades to view del_view.v_del_read drop cascades to view del_view.vvt1t2 drop cascades to view del_view.vv_dup drop cascades to view del_view.vv_dup_wco DROP SCHEMA
  • 注意事项 表的所有者、被授予表DELETE权限的用户或被授予DELETE ANY TABLE权限的用户有权删除表中数据,当三权分立开关关闭时,系统管理员默认拥有此权限。同时在进行DELETE操作时,用户也必须拥有USING子句所引用的表以及condition上读取的表的SELECT权限。 对于行存复制表,仅支持两种场景下的DELETE操作: 有主键约束的场景。 执行计划能下推的场景。 对于子查询是STREAM计划的DELETE语句,不支持删除的行数据同时进行UPDATE更新操作。
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 column_name指定子查询结果集中显示的列名。 每个子查询可以是SELECT、VALUES、INSERT、UPDATE或DELETE语句。 用户可以使用MATERIALIZED / NOT MATERIALIZED对CTE进行修饰。 如果声明为MATERIALIZED,WITH查询将被物化,生成一个子查询结果集的复制,在引用处直接查询该复制,因此WITH子查询无法和主干SELECT语句进行联合优化(如谓词下推、等价类传递等),对于此类场景可以使用NOT MATERIALIZED进行修饰,如果WITH查询语义上可以作为子查询内联执行,则可以进行上述优化。 如果用户没有显示声明物化属性则遵守以下规则:如果CTE只在所属主干语句中被引用一次,且语义上支持内联执行,则会被改写为子查询内联执行,否则以CTE Scan的方式物化执行。 plan_hint 以/*+ */的形式在DELETE关键字后,用于对DELETE对应的语句块生成的计划进行hint调优,详细用法请参见章节使用Plan Hint进行调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。 ONLY 如果指定ONLY则只有该表被删除;如果没有声明,则该表和它的所有子表将都被删除。 table_name 目标表的名称(可以有模式修饰)。 取值范围:已存在的表名。 支持使用DATABASE LINK方式对远端表进行操作,使用方式详情请见DATABASE LINK。 subquery 删除目标对象可以是子查询,在对子查询中的数据进行删除时,会将子查询当成一个临时视图,支持在子查询后面加CHECK OPTION选项。 [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [/*+ plan_hint */] [ ALL ] { * | {expression [ [ AS ] output_name ]} [, ...] } [ into_option ] [ FROM from_item [, ...] ] [ WHERE condition ] [ [ START WITH condition ] CONNECT BY [NOCYCLE] condition [ ORDER SIBLINGS BY expression ] ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ into_option ]; 其中指定子查询源from_item为: {[ ONLY ] {table_name | view_name} [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |( select ) [ AS ] alias [ ( column_alias [, ...] ) ] |with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]} 如果子查询中只有一张表,则对该表做删除;如果子查询中有多张表或有嵌套关系,则通过判断是否有保留键表确定是否可删除。关于保留键表和WITH CHECK OPTION请参见CREATE VIEW。 view_name 目标视图的名称。 对视图和子查询的删除,有如下约束: 只有直接引用基表用户列的列可进行DELETE。 子查询或视图必须至少包含一个可更新列,关于可更新列请参见CREATE VIEW。 不支持在顶层包含DISTINCT、GROUP BY、HAVING、LIMIT、OFFSET子句的视图和子查询。 不支持在顶层包含集合运算(UNION、INTERSECT、EXCEPT、MINUS)的视图和子查询。 不支持目标列表中包含聚集函数、窗口函数、返回集合函数(array_agg、json_agg、generate_series等)的视图和子查询。 不支持仅带有BEFORE/AFTER触发器,没有INSTEAD OF触发器或INSTEAD规则的视图。 视图和子查询中支持的表类型包括普通表、临时表、全局临时表、分区表、二级分区表、ustore表、astore表。 连接视图或子查询只能对视图或子查询中的保留键表做删除操作,如果只存在一张保留键表,则删除该表数据,如果存在多张保留键表,仅删除FROM后的第一张保留键表的数据。 如果连接视图或子查询中指定了CHECK OPTION选项,且基表重复,重复的基表与视图或子查询中保留键表属性不一致,则无法从连接视图或子查询中删除行。关于保留键表请参见CREATE VIEW。 不支持对系统视图进行删除。 不支持多表删除功能。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 using_list using子句。 condition 一个返回Boolean值的表达式,用于判断哪些行需要被删除。建议不要使用int等数值类型作为condition,因为int等数值类型可以隐式转换为bool值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。 WHERE CURRENT OF cursor_name 当cursor指向表的某一行时,可以使用此语法删除cursor当前指向的行。使用限制及约束请参考UPDATE章节对此语法介绍。 ORDER BY 关键字详见SELECT章节介绍。 LIMIT 关键字详见SELECT章节介绍。 output_expr DELETE命令删除行之后计算输出结果的表达式,该表达式可以使用表的任意字段,可以使用*返回被删除行的所有字段。 output_name 一个字段的输出名称。 取值范围:字符串,符合标识符命名规范。
  • 语法格式 1 2 3 4 5 6 7 [ WITH [ RECURSIVE ] with_query [, ...] ] DELETE [/*+ plan_hint */] [FROM] [ ONLY ] {table_name [ * ] subquery [ [ AS ] alias ] | view_name [ [ AS ] alias ]} [ USING using_list ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ ORDER BY {expression [ ASC | DESC | USING operator ] } ] [ LIMIT row_count ] [ RETURNING { * | { output_expr [ [ AS ] output_name ] } [, ...] } ];
  • 注意事项 只有数据库所有者或者被授予了数据库DROP权限的用户有权限执行DROP DATABASE命令,系统管理员默认拥有此权限。 不能对系统默认安装的四个数据库(POSTGRES、TEMPLATE0、TEMPLATE1和TEMPLATEA)执行删除操作,系统做了保护。如果想查看当前服务中有哪几个数据库,可以用gsql的\l命令查看。 如果有用户正在与要删除的数据库连接,则删除操作失败。可以通过视图DV_SESSIONS查看当前有哪些数据库连接。 不能在事务块中执行DROP DATABASE命令。 确定删除数据库前需要执行“CLEAN CONNECTION TO ALL FORCE FOR DATABASE XXXX;”命令,用于强制停止当前已有的用户连接及后台线程,防止因为有后台线程未完全退出而导致的删库失败问题。此处需要注意,强制停止后台线程可能导致当前数据库数据一致性问题,此命令仅在确定删库阶段执行。 如果执行DROP DATABASE失败,事务回滚,需要再次执行一次DROP DATABASE IF EXISTS。 DROP DATABASE一旦执行将无法撤销,请谨慎使用。