华为云用户手册

  • 示例 创建一个名为seq1的递增序列,从101开始,步长为10。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 gaussdb=# CREATE SEQUENCE seq1 START 101 INCREMENT 10; --从序列中选出下一个数字: gaussdb=# SELECT nextval('seq1'); nextval --------- 101 (1 row) gaussdb=# SELECT nextval('seq1'); nextval --------- 111 --删除序列。 gaussdb=# DROP SEQUENCE seq1; 表自增列的一种实现。 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 --创建表。 gaussdb=# CREATE TABLE test1(id int PRIMARY KEY, name varchar(20)); --创建与表关联的序列。 gaussdb=# CREATE SEQUENCE test_seq2 START 1 NO CYCLE OWNED BY test1.id; --设置字段的默认值。 gaussdb=# ALTER TABLE test1 ALTER COLUMN id SET DEFAULT nextval('test_seq2'::regclass); -- 插入数据。 gaussdb=# INSERT INTO test1 (name) values ('Joe'),('Scott'),('Ben'); --查询。 gaussdb=# SELECT * FROM test1; id | name ----+------- 3 | Ben 1 | Joe 2 | Scott (3 rows) --删除序列和表。 gaussdb=# DROP SEQUENCE test_seq2 CASCADE; gaussdb=# DROP TABLE test1;
  • 注意事项 SEQUENCE是一个存放等差数列的特殊表。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。 被授予CREATE ANY SEQUENCE权限的用户,可以在public模式和用户模式下创建序列。
  • 参数说明 IF NOT EXISTS 如果指定IF NOT EXISTS关键字,创建序列前会在当前SCHEMA中查找是否已有名字相同的relation。若已有同名relation存在,则不会新建,返回NOTICE提示。未指定IF NOT EXISTS关键字时,若SCHEMA中存在同名relation,返回ERROR告警。 name 将要创建的序列名称。 取值范围: 仅可以使用小写字母(a~z)、 大写字母(A~Z)、数字和特殊字符“#” 、“_”、“$”的组合。 increment 可选。指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。 缺省值为1。 在MYSQL兼容模式下,步长为浮点数时会自动转为整型。其他模式下,该参数不支持输入浮点数。 MINVALUE minvalue | NO MINVALUE| NOMINVALUE 可选。执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。NOMINVALUE等价于NO MINVALUE。 MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE 可选。执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE。 start 可选。指定序列的起始值。缺省值:对于递增序列为minvalue,递减序列为maxvalue。 cache 可选。为了快速访问,而在内存中预先存储序列号的个数。 缺省值为1,表示一次只能生成一个值,也就是没有缓存。 不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。如对并发性能有要求,请同时参考guc参数session_sequence_cache。 cache指定了单CN/DN一次向GTM中申请的值;session_sequence_cache指定的是单个会话一次向CN/DN申请缓存的值,会话结束后会自动丢弃。 CYCLE 可选。用于使序列达到maxvalue或者minvalue后可循环并继续下去。 如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。 NOCYCLE的作用等价于NO CYCLE。缺省值为NO CYCLE。 若定义序列为CYCLE,则不能保证序列的唯一性。 OWNED BY 可选。将序列和一个表的指定字段进行关联。这样,在删除该字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需要注意的是,通过指定OWNED BY,仅仅是建立了表的对应列和SEQUENCE之间关联关系,并不会在插入数据时在该列上产生自增序列。 缺省值为OWNED BY NONE,表示不存在这样的关联。 通过OWNED BY创建的SEQUENCE不建议用于其他表,如果希望多个表共享SEQUENCE,该SEQUENCE不应该从属于特定表。
  • 语法格式 1 2 3 4 CREATE SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] [ OWNED BY { table_name.column_name | NONE } ];
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 --产生0到1之间的随机数: SELECT DBE_RANDOM.GET_VALUE(0,1); get_value ------------------ .917468812743886 (1 row) --对于指定范围内的整数,要加入参数min和max,并从结果中截取较小的数(最大值不能被作为可能的值)。所以对于0到99之间的整数,使用下面的代码: SELECT TRUNC(DBE_RANDOM.GET_VALUE(0,100)); trunc ------- 26 (1 row)
  • 接口介绍 高级功能包DBE_RANDOM支持的所有接口请参见表 DBE_RANDOM接口参数说明。 表1 DBE_RANDOM接口参数说明 接口名称 描述 DBE_RANDOM.SET_SEED 设置一个随机数的种子。 DBE_RANDOM.GET_VALUE 生成一个大小介于指定的low及high之间的随机数。 DBE_RANDOM.SET_SEED 存储过程SEED用于设置一个随机数的种子。DBE_RANDOM.SET_SEED函数原型为: 1 DBE_RANDOM.SET_SEED (seed IN INTEGER); 表2 DBE_RANDOM.SET_SEED接口参数说明 参数 描述 seed 用于产生一个随机数的种子。 DBE_RANDOM.GET_VALUE 函数GET_VALUE生成一个大小介于指定的low及high之间的随机数。DBE_RANDOM.GET_VALUE函数原型为: 1 2 3 4 DBE_RANDOM.GET_VALUE( min IN NUMBER default 0, max IN NUMBER default 1) RETURN NUMBER; 表3 DBE_RANDOM.GET_VALUE接口参数说明 参数 描述 min 指定随机数大小的下边界,生成的随机数大于或等于min。 max 指定随机数大小的上边界,生成的随机数小于max。 实际上,只要求这里的参数类型是NUMERIC即可,对于左右边界的大小并没有要求。 DBE_RANDOM实现的是伪随机,所以若使用的初值(种子)不变,那么伪随机数的数序也不变,使用时需要注意。 生成的随机数有效数字为15位。
  • 通用文件访问函数 通用文件访问函数提供了对数据库服务器上的文件的本地访问接口。只有数据库集群目录和log_directory目录里面的文件可以访问。使用相对路径访问集群目录里面的文件,以及匹配log_directory配置而设置的路径访问日志文件。只有数据库初始化用户才能使用这些函数。 pg_ls_dir(dirname text) 描述:列出目录中的文件。 返回值类型:setof text 备注:pg_ls_dir返回指定目录里面的除了特殊项“.”和“..”之外所有名称。 示例: 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 31 32 33 34 35 36 gaussdb=# SELECT pg_ls_dir('./'); pg_ls_dir ---------------------- .gaussdb.conf.swp gaussdb.conf pg_tblspc PG_VERSION gs_ident.conf core server.crt pg_serial pg_twophase gaussdb.conf.lock pg_stat_tmp pg_notify pg_subtrans pg_ctl.lock pg_xlog pg_clog base pg_snapshots postmaster.opts postmaster.pid server.key.rand server.key.cipher pg_multixact pg_errorinfo server.key gs_hba.conf pg_replslot .gs_hba.conf.swp cacert.pem gs_hba.conf.lock global gaussdb.state (32 rows) pg_read_file(filename text, offset bigint, length bigint) 描述:返回一个文本文件的内容。 返回值类型:text 备注:pg_read_file返回一个文本文件的一部分,从offset开始,最多返回length字节(如果先达到文件结尾,则小于这个数值)。如果offset是负数,则它是相对于文件结尾回退的长度。如果省略了offset和length,则返回整个文件。 示例: 1 2 3 4 5 6 7 8 9 10 11 gaussdb=# SELECT pg_read_file('postmaster.pid',0,100); pg_read_file --------------------------------------- 53078 + /srv/BigData/testdir/data1/coordinator+ 1500022474 + 8000 + /var/run/ FusionInsight + localhost + 2 (1 row) pg_read_binary_file(filename text [, offset bigint, length bigint,missing_ok boolean]) 描述:返回一个二进制文件的内容。 返回值类型:bytea 备注:pg_read_binary_file的功能与pg_read_file类似,除了结果的返回值为bytea类型不一致,相应地不会执行编码检查。与convert_from函数结合,这个函数可以用来读取用指定编码的一个文件。 1 gaussdb=# SELECT convert_from(pg_read_binary_file('filename'), 'UTF8'); pg_stat_file(filename text) 描述:返回一个文本文件的状态信息。 返回值类型:record 备注:pg_stat_file返回一条记录,其中包含:文件大小、最后访问时间戳、最后更改时间戳、最后文件状态修改时间戳以及标识传入参数是否为目录的Boolean值。典型的用法: 1 gaussdb=# SELECT * FROM pg_stat_file('filename'); 1 gaussdb=# SELECT (pg_stat_file('filename')).modification; 示例: 1 2 3 4 5 6 7 8 9 10 11 12 gaussdb=# SELECT convert_from(pg_read_binary_file('postmaster.pid'), 'UTF8'); convert_from -------------------------------------- 4881 + /srv/BigData/gaussdb/data1/coordinator+ 1496308688 + 25108 + /opt/huawei/Bigdata/gaussdb/gaussdb_tmp + * + 25108001 43352069 + (1 row) 1 2 3 4 5 6 7 8 9 gaussdb=# SELECT * FROM pg_stat_file('postmaster.pid'); size | access | modification | change | creation | isdir ------+------------------------+------------------------+------------------------ +----------+------- 117 | 2017-06-05 11:06:34+08 | 2017-06-01 17:18:08+08 | 2017-06-01 17:18:08+08 | | f (1 row) 1 2 3 4 5 gaussdb=# SELECT (pg_stat_file('postmaster.pid')).modification; modification ------------------------ 2017-06-01 17:18:08+08 (1 row) 父主题: 系统管理函数
  • 示例 强制使用Custom Plan: 1 2 3 4 set enable_fast_query_shipping = off; create table t (a int, b int, c int); prepare p as select /*+ use_cplan */ * from t where a = $1; explain execute p(1); 计划如下,可以看到过滤条件为入参的实际值,即此计划为Custom Plan。 强制使用Generic Plan: 1 2 3 deallocate p; prepare p as select /*+ use_gplan */ * from t where a = $1; explain execute p(1); 计划如下,可以看到过滤条件为待填充的入参,即此计划为Generic Plan。
  • 条件表达式 在执行SQL语句时,可通过条件表达式筛选出符合条件的数据。 条件表达式主要有以下几种: CASE CASE表达式是条件表达式,类似于其他编程语言中的CASE语句。 CASE表达式的语法图如图1所示。 图1 case::= CASE子句可以用于合法的表达式中。condition是一个返回BOOLEAN数据类型的表达式: 如果结果为真,CASE表达式的结果就是符合该条件所对应的result。 如果结果为假,则以相同方式处理随后的WHEN或ELSE子句。 如果各WHEN condition都不为真,表达式的结果就是在ELSE子句执行的result。如果省略了ELSE子句且没有匹配的条件,结果为NULL。 支持对XML类型数据操作。 GUC参数enable_case_intervaltonumeric设置为true时,支持将INTERVAL转换为NUMERIC而不报错。 示例: 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 gaussdb=# CREATE TABLE case_when_t1(CW_COL1 INT) DISTRIBUTE BY HASH (CW_COL1); gaussdb=# INSERT INTO case_when_t1 VALUES (1), (2), (3); gaussdb=# SELECT * FROM case_when_t1; cw_col1 --- 1 2 3 (3 rows) gaussdb=# SELECT CW_COL1, CASE WHEN CW_COL1=1 THEN 'one' WHEN CW_COL1=2 THEN 'two' ELSE 'other' END FROM case_when_t1 ORDER BY 1; cw_col1 | case ---------+------- 1 | one 2 | two 3 | other (3 rows) gaussdb=# DROP TABLE case_when_t1; -- GUC参数默认为false,此时报错。 gaussdb=# SHOW enable_case_intervaltonumeric; enable_case_intervaltonumeric ------------------------------- off (1 row) gaussdb=# SELECT case gaussdb-# WHEN 1=1 THEN gaussdb-# to_date('20240118','yyyymmdd')-to_date('20240116','yyyymmdd') gaussdb-# ELSE gaussdb-# 1 gaussdb-# end; ERROR: CASE types integer and interval cannot be matched LINE 3: to_date('20240118','yyyymmdd')-to_date('20240116','y... ^ CONTEXT: referenced column: case -- 打开GUC参数,能正确返回结果。 gaussdb=# SET enable_case_intervaltonumeric=true; SET gaussdb=# SELECT case gaussdb-# WHEN 1=1 THEN gaussdb-# to_date('20240118','yyyymmdd')-to_date('20240116','yyyymmdd') gaussdb-# ELSE gaussdb-# 1::int1 gaussdb-# END; case ------ 2 (1 row) DECODE DECODE的语法图如图2所示。 图2 decode::= 将表达式base_expr与后面的每个compare(n) 进行比较,如果匹配返回相应的value(n)。如果没有发生匹配,则返回default。 支持对XML类型数据操作。 示例请参见条件表达式函数。 1 2 3 4 5 gaussdb=# SELECT DECODE('A','A',1,'B',2,0); case ------ 1 (1 row) COALESCE COALESCE的语法图如图3所示。 图3 coalesce::= COALESCE返回它的第一个非NULL的参数值。如果参数都为NULL,则返回NULL。它常用于在显示数据时用缺省值替换NULL。和CASE表达式一样,COALESCE只计算用来判断结果的参数,即在第一个非空参数右边的参数不会被计算。 支持对XML类型数据操作。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 gaussdb=# CREATE TABLE c_tabl(description varchar(10), short_description varchar(10), last_value varchar(10)) DISTRIBUTE BY HASH (last_value); gaussdb=# INSERT INTO c_tabl VALUES('abc', 'efg', '123'); gaussdb=# INSERT INTO c_tabl VALUES(NULL, 'efg', '123'); gaussdb=# INSERT INTO c_tabl VALUES(NULL, NULL, '123'); gaussdb=# SELECT description, short_description, last_value, COALESCE(description, short_description, last_value) FROM c_tabl ORDER BY 1, 2, 3, 4; description | short_description | last_value | coalesce -------------+-------------------+------------+---------- abc | efg | 123 | abc | efg | 123 | efg | | 123 | 123 (3 rows) gaussdb=# DROP TABLE c_tabl; 如果description不为NULL,则返回description的值,否则计算下一个参数short_description;如果short_description不为NULL,则返回short_description的值,否则计算下一个参数last_value;如果last_value不为NULL,则返回last_value的值,否则返回(none)。 1 2 3 4 5 gaussdb=# SELECT COALESCE(NULL,'Hello World'); coalesce --------------- Hello World (1 row) NULLIF NULLIF的语法图如图4所示。 图4 nullif::= 只有当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。支持对XML类型数据操作。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 gaussdb=# CREATE TABLE null_if_t1 ( NI_VALUE1 VARCHAR(10), NI_VALUE2 VARCHAR(10) )DISTRIBUTE BY HASH (NI_VALUE1); gaussdb=# INSERT INTO null_if_t1 VALUES('abc', 'abc'); gaussdb=# INSERT INTO null_if_t1 VALUES('abc', 'efg'); gaussdb=# SELECT NI_VALUE1, NI_VALUE2, NULLIF(NI_VALUE1, NI_VALUE2) FROM null_if_t1 ORDER BY 1, 2, 3; ni_value1 | ni_value2 | nullif -----------+-----------+-------- abc | abc | abc | efg | abc (2 rows) gaussdb=# DROP TABLE null_if_t1; 如果value1等于value2则返回NULL,否则返回value1。 1 2 3 4 5 gaussdb=# SELECT NULLIF('Hello','Hello World'); nullif -------- Hello (1 row) GREATEST(最大值),LEAST(最小值) GREATEST的语法图如图5所示。 图5 greatest::= 从一个任意数字表达式的列表里选取最大的数值。支持对XML类型数据操作。 1 2 3 4 5 gaussdb=# SELECT greatest(9000,155555,2.01); greatest ---------- 155555 (1 row) LEAST的语法图如图6所示。 图6 least::= 从一个任意数字表达式的列表里选取最小的数值。 以上的数字表达式必须都可以转换成一个普通的数据类型,该数据类型将是结果类型。 列表中的NULL值将被忽略。只有所有表达式的结果都是NULL的时候,结果才是NULL。 支持对XML类型数据操作。 1 2 3 4 5 gaussdb=# SELECT least(9000,2); least ------- 2 (1 row) 示例请参见条件表达式函数。 NVL NVL的语法图如图7所示。 图7 nvl::= 如果value1为NULL,则返回value2,如果value1非NULL,则返回value1。支持对XML类型数据操作。 示例: 1 2 3 4 5 gaussdb=# SELECT nvl(null,1); nvl ----- 1 (1 row) 1 2 3 4 5 gaussdb=# SELECT nvl('Hello World',1); nvl --------------- Hello World (1 row) 父主题: 表达式
  • 注意事项 EXPLAIN PLAN不支持在DN上执行。 对于执行错误的SQL语句无法进行计划信息的收集。 PLAN_TABLE中的数据是session级生命周期并且session隔离和用户隔离,用户只能看到当前session、当前用户的数据。 PLAN_TABLE无法与GDS外表进行关联查询。 对于不能下推的查询,执行EXPLAIN PLAN后PLAN_TABLE中的object仅收集到REMOTE_QUERY或CTE等信息。详见示例 2。 EXPLAIN中的PLAN选项表示需要将计划信息存储于PLAN_TABLE中,存储成功将返回“EXPLAIN SUC CES S”。 用户可通过STATEMENT_ID对查询设置标签,输入的标签信息也将存储于PLAN_TABLE中。 执行EXPLAIN PLAN 后会将计划信息自动存储于PLAN_TABLE中,不支持对PLAN_TABLE进行INSERT、UPDATE、ANALYZE等操作。PLAN_TABLE详细介绍见PLAN_TABLE。
  • 算子级调优介绍 一个查询语句要经过多个算子步骤才会输出最终的结果。由于个别算子耗时过长导致整体查询性能下降的情况比较常见。这些算子是整个查询的瓶颈算子。通用的优化手段是EXPLAIN ANALYZE/PERFORMANCE命令查看执行过程的瓶颈算子,然后进行针对性优化。 如下面的执行过程信息中,Hashagg算子的执行时间占总时间的:(51016-13535)/ 56476 ≈66%,此处Hashagg算子就是这个查询的瓶颈算子,在进行性能优化时应当优先考虑此算子的优化。
  • 示例 开启事务。 --建表并插入数据。 gaussdb=# CREATE TABLE tbl_test1(col1 int, col2 int); gaussdb=# INSERT INTO tbl_test1 VALUES (1,1), (2,2), (3,3); --以默认方式启动事务。 gaussdb=# BEGIN; INSERT INTO tbl_test1 VALUES (4,4); END; --以隔离级别为REPEATABLE READ方式启动事务。 gaussdb=# BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT * FROM tbl_test1; END; --删除表。 gaussdb=# DROP TABLE tbl_test1; 匿名块。 1 2 3 4 5 --使用匿名块输出字符串。 gaussdb=# BEGIN dbe_output.print_line('Hello'); END; /
  • 语法格式 开启匿名块。 1 2 3 4 5 [DECLARE [declare_statements]] BEGIN execution_statements END; / 开启事务。 1 2 3 4 5 6 7 BEGIN [ WORK | TRANSACTION ] [ { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ];
  • 参数说明 declare_statements 声明变量,包括变量名和变量类型,如“sales_cnt int”。 execution_statements 匿名块中要执行的语句。 取值范围:已存在的函数名称。 WORK | TRANSACTION BEGIN语法格式中的可选关键字,没有实际作用。 ISOLATION LEVEL 指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。 在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 取值范围: READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 READ UNCOMMITTED:读未提交隔离级别,可能会读到未提交的数据。提供这个隔离级别可用于在存在某协调节点CN故障等情况下应急使用,建议这种隔离级别下仅作只读操作,避免造成数据不一致。 REPEATABLE READ: 可重复读隔离级别,仅仅看到事务开始之前提交的数据,它不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 SERIALIZABLE:目前功能上不支持此隔离级别,设置该隔离级别时,等价于REPEATABLE READ。 READ WRITE | READ ONLY 指定事务访问模式(读/写或者只读)。
  • 参数说明 server_name server的名称。 取值范围:长度必须小于等于63字节。 FOREIGN DATA WRAPPER fdw_name 指定外部数据封装器的名称。 取值范围:fdw_name是数据库初始化时系统创建的数据封装器,对于其他同构集群,fdw_name为gc_fdw。还可以创建dist_fdw、file_fdw、log_fdw。其中log_fdw仅做语法兼容,可以创建外表,无实际使用意义;dist_fdw用于gds导数,由于有内置gsmpp_server,因此不需要手动用dist_fdw创建server。 OPTIONS ( { option_name ' value ' } [, ...] ) 用于指定外部服务器的各类参数,详细的参数说明如下所示。 address 外部服务器地址。 dbname 外部服务器DB名称。 username 外部服务器用户名。 password 外部服务器密码。
  • 注意事项 默认只有系统管理员才可以创建外部服务器,否则需要对所使用的FOREIGN DATA WRAPPER授权才可以创建,授权语法为: GRANT USAGE ON FOREIGN DATA WRAPPER fdw_name TO username 其中fdw_name为FOREIGN DATA WRAPPER的名称,username为创建SERVER的用户名。 OPTIONS中的敏感字段(如password)在使用多层引号时,语义和不带引号的场景是不同的,因此不会被识别为敏感字段进行脱敏。
  • 示例 创建一个SERVER,其中file_fdw为数据库中存在的FOREIGN DATA WRAPPER。 1 2 3 4 5 --创建SERVER。 gaussdb=# CREATE SERVER my_server FOREIGN DATA WRAPPER file_fdw; --删除SERVER。 gaussdb=# DROP SERVER my_server; 建立另外一个同构集群的server,其中gc_fdw为数据库中存在的foreign data wrapper。 1 2 3 4 5 6 7 8 9 10 --创建SERVER。 gaussdb=# CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '10.146.187.231:8000,10.180.157.130:8000' , dbname 'test', username 'test', password '********' ); --删除SERVER。 gaussdb=# DROP SERVER server_remote; 相关链接 ALTER SERVER, DROP SERVER
  • Psycopg包 准备相关驱动和依赖库。可以从发布包中获取,包名为 GaussDB -Kernel_数据库版本号_操作系统版本号_64bit_Python.tar.gz。 解压后有两个文件夹: psycopg2:psycopg2库文件。 lib:lib库文件。 加载驱动。 在使用驱动之前,需要做如下操作: 先解压版本对应驱动包。 tar zxvf xxxx-Python.tar.gz 使用root用户将psycopg2复制到python安装目录下的site-packages文件夹下。 su root cp psycopg2 $(python3 -c 'import site; print(site.getsitepackages()[0])') -r 修改psycopg2目录权限为755。 chmod 755 $(python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R 将psycopg2目录添加到环境变量$PYTHONPATH,并使之生效。 export PYTHONPATH=$(python3 -c 'import site; print(site.getsitepackages()[0])'):$PYTHONPATH 对于非数据库用户,需要将解压后的lib目录,配置在LD_LIBRARY_PATH中。 export LD_LIBRARY_PATH=path/to/lib:$LD_LIBRARY_PATH 在创建数据库连接之前,需要先加载如下数据库驱动程序: 1 import psycopg2 连接数据库。 非SSL方式连接数据库: 使用psycopg2.connect函数获得connection对象。 使用connection对象创建cursor对象。 SSL方式连接数据库: 用户通过psycopy2连接GaussDB服务器时,可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参见Openssl相关文档和命令。 使用*.ini文件(python的configparser包可以解析这种类型的配置文件)保存数据库连接的配置信息。 在连接选项中添加SSL连接相关参数:sslmode、sslcert、sslkey、sslrootcert。 sslmode:可选项见表1。 sslcert:客户端证书路径。 sslkey:客户端密钥路径。 sslrootcert:根证书路径。 使用psycopg2.connect函数获得connection对象。 使用connection对象创建cursor对象。 使用SSL安全连接数据库,需保证所使用的python解释器为生成动态链接库(.so)文件的方式编译,可通过如下步骤确认python解释器的连接方式。 在python解释器命令行中输入import ssl,导入SSL。 执行ps ux查询python解释器运行的pid(假设pid为******)。 在shell命令行中执行pmap -p ****** | grep ssl,查看返回结果中是否包含libssl.so的相关路径。如果有,则python解释器为动态链接方式编译。 表1 sslmode的可选项及其描述 sslmode 是否会启用SSL加密 描述 disable 否 不使用SSL安全连接。 allow 可能 如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。 prefer 可能 如果数据库支持,那么首选使用SSL连接,但不验证数据库服务器的真实性。 require 是 必须使用SSL安全连接,但是仅进行 数据加密 ,而并不验证数据库服务器的真实性。 verify-ca 是 必须使用SSL安全连接,并且校验服务端CA有效性。 verify-full 是 必须使用SSL安全连接,目前GaussDB暂不支持。 执行SQL语句。 构造操作语句,使用%s作为占位符,执行时psycopg2会用参数值智能替换掉占位符。可以添加RETURNING子句,来得到自动生成的字段值。 使用cursor.execute方法来操作一行SQL语句,使用cursor.executemany方法来操作多行SQL语句。 处理结果集。 cursor.fetchone():这种方法提取的查询结果集的下一行,返回一个序列,没有数据可用时则返回空。 cursor.fetchall():这个方法获取所有查询结果(剩余)行,返回一个列表。空行时则返回空列表。 对于数据库特有数据类型,如tinyint类型,查询结果中相应字段为字符串形式。 关闭连接。 在使用数据库连接完成相应的数据操作后,需要关闭数据库连接。关闭数据库连接可以直接调用其close方法,如connection.close()。 此方法关闭数据库连接,并不自动调用commit()。如果只是关闭数据库连接而不调用commit()方法,那么所有更改将会丢失。 父主题: 基于Psycopg开发
  • 参数 表1 SQLBindParameter 关键词 参数说明 StatementHandle 语句句柄。 ParameterNumber 参数序号,起始为1,依次递增。 InputOutputType 输入输出参数类型。可以是SQL_PA RAM _INPUT、SQL_PARAM_OUTPUT、SQL_PARAM_INPUT_OUTPUT。 ValueType 参数的C数据类型。可以是SQL_C_CHAR、SQL_C_LONG、SQL_C_DOUBLE等。 ParameterType 参数的SQL数据类型。可以是SQL_CHAR、SQL_INTEGER、SQL_DOUBLE等。 ColumnSize 相应参数标记的列或表达式的大小。 DecimalDigits 相应参数标记的列或表达式的十进制数字。 ParameterValuePtr 指向存储参数数据缓冲区的指针。 BufferLength ParameterValuePtr指向缓冲区的长度,以字节为单位。 StrLen_or_IndPtr 缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。
  • 原型 1 2 3 4 5 6 7 8 9 10 SQLRETURN SQLBindParameter(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT InputOutputType, SQLSMALLINT ValuetType, SQLSMALLINT ParameterType, SQLULEN ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_IndPtr);
  • 参数说明 UN LOG GED 指定表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是,非日志表在冲突或异常关机后会被自动删截,非日志表中的内容也不会被复制到备用服务器中,在该类表中创建的索引也不会被自动记录。 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 GLOBAL | LOCAL 创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。目前这两个关键字的设立,仅是为了兼容SQL标准,实际上无论指定GLOBAL还是LOCAL,GaussDB都会创建本地临时表。 TEMPORARY | TEMP 如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表只在当前会话可见,当前会话结束后会自动删除。因此,若当前会话连接的CN以外的其他CN故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。 临时表通过每个会话独立的以pg_temp开头的SCHEMA来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg_temp,pg_toast_temp开头的SCHEMA。 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的SCHEMA为当前会话的pg_temp开头的SCHEMA,则该表会被创建为临时表。 临时表只对当前会话可见,因此不支持与\parallel on并行执行一起使用。 临时表不支持DN故障或者主备切换。 IF NOT EXISTS 如果指定IF NOT EXISTS关键字,创建表前会在当前SCHEMA中查找是否已有名字相同的relation。若已有同名relation存在,则不会新建,返回NOTICE提示。未指定IF NOT EXISTS关键字时,若SCHEMA中存在同名relation,返回ERROR告警。 table_name 要创建的表名。 取值范围:字符串,要符合标识符命名规范。 column_name 可选。新表中要创建的字段名。如果没有指定字段名,那么新表的字段名和SELECT语句输入的字段名一致。 取值范围:字符串,要符合标识符命名规范。 ENGINE MYSQL模式下支持,仅语法适配,且只支持设置InnoDB,无实际效果。 WITH ( storage_parameter [= value] [, ... ] ) 这个子句为表或索引指定一个可选的存储参数。参数的详细说明如下所示。 FILLFACTOR 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。在Ustore存储引擎下,该值的默认值为92。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数只对行存表有效。 取值范围:10~100 ORIENTATION 取值范围: COLUMN:表的数据将以列式存储。 ROW(缺省值):表的数据将以行式存储。 COMPRESSION 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。 取值范围: 行存表不支持压缩。 hashbucket 创建hash bucket存储。本参数仅支持行存表和行存range表。 取值范围:on/off 默认值:off 当前版本hashbucket表相关DDL操作性能受限,不建议频繁对hashbucket表进行DDL操作。 ON COMMIT { PRESERVE ROWS | DELETE ROWS } ON COMMIT选项决定在事务中执行创建临时表操作,当事务提交时,此临时表的后续操作。当前仅支持PRESERVE ROWS和DELETE ROWS选项。 PRESERVE ROWS(缺省值):提交时不对临时表执行任何操作,临时表及其表数据保持不变。 DELETE ROWS:提交时删除临时表中数据。 COMPRESS / NOCOMPRESS 创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。行存表不支持压缩。 缺省值:NOCOMPRESS,即不对元组数据进行压缩。 [ ILM ADD POLICY ROW STORE { COMPRESS ADVANCED } { ROW } AFTER n { day | month | year } OF { NO MODIFICATION } [ ON ( EXPR )]] 创建新表时,可以调用ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW给行存添加高级压缩策略。 AFTER n { day | month | year } OF NO MODIFICATION :表示n天/月/年没有修改的行。 ON ( EXPR ):行级表达式,用于判断行的冷热。 TABLESPACE tablespace_name 指定新表将要在tablespace_name表空间内创建。如果没有声明,将使用默认表空间。 DISTRIBUTE BY 详细信息见•DISTRIBUTE BY。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } TO GROUP指定创建表所在的Node Group。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 AS query 一个SELECT VALUES命令或者一个运行预备好的SELECT或VALUES查询的EXECUTE命令。 [ WITH [ NO ] DATA ] 创建表时,是否也插入查询到的数据。默认是要数据,选择“NO”参数时,则不要数据。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name [ (column_name [, ...] ) ] [ { ENGINE [ = ] { InnoDB | 'InnoDB' | "InnoDB" } } [ [ , ] ... ] ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ] [ COMPRESS | NOCOMPRESS ] [ ILM ADD POLICY ROW STORE { COMPRESS ADVANCED } { ROW } AFTER n { day | month | year } OF { NO MODIFICATION } [ ON ( EXPR )]] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY { REPLICATION | { [HASH ] ( column_name ) } } ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] AS query [ WITH [ NO ] DATA ]; 各个字段详细信息见语法格式。
  • 功能描述 根据查询结果创建表。 CREATE TABLE AS创建一个表并且用来自SELECT命令的结果填充该表。该表的字段和SELECT输出字段的名称及数据类型相关。不过用户可以通过明确地给出一个字段名称列表来覆盖SELECT输出字段的名称。 CREATE TABLE AS和创建视图有些相似,CREATE TABLE AS会创建一个新表并且只计算该查询一次用来将数据写入新表中。这个表之后将不会根据源表变化而改变。相反视图只要被查询,它的定义SELECT语句将会被重新计算。
  • 背景信息 索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间。所以是否要为表增加索引,索引建立在哪些字段上,是创建索引前必须要考虑的问题。需要分析应用程序的业务处理、数据使用、经常被用作查询的条件或者被要求排序的字段来确定是否建立索引。 索引建立在数据库表中的某些列上。因此,在创建索引时,应该仔细考虑在哪些列上创建索引。 在经常需要搜索查询的列上创建索引,可以加快搜索的速度。 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。 在经常使用连接的列上创建索引,可以加快连接的速度。 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。 在经常使用WHERE子句的列上创建索引,加快条件的判断速度。 在经常出现关键字ORDER BY、GROUP BY和DISTINCT后面的字段建立索引。 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。 分区表索引分为LOCAL索引与GLOBAL索引,一个LOCAL索引对应一个具体分区,而GLOBAL索引则对应整个分区表。
  • 参数说明 groupname 需要修改的node group名称。 取值范围:字符串,要符合标识符命名规范。 SET DEFAULT 将系统中除了groupname指定的node group之外的其他node group对象的in_redistribution字段设置为'y'。考虑到兼容以前版本,该语法仍然保留,且不需要设置维护模式。 RENAME TO new_group_name 将groupname指定的node group的名称修改为new_group_name。 SET TABLE GROUP new_group_name 将所有CN节点的pgxc_class表中pgroup字段是group_name的记录修改为new_group_name。 COPY BUCKETS FROM src_group_name 从src_group_name表示的NodeGroup中,将group_members字段和group_buckets字段的内容复制到groupname所表示的NodeGroup中。 ADD NODE ( nodename [, ... ] ) 从groupname指定的NodeGroup中增加指定的节点,这些新增节点在PGXC_NODE系统表中存在。该语句仅仅修改系统表,不会进行实际的节点添加和数据重分布,用户不应该直接调用该SQL语句。可以在PGXC_GROUP系统表中观察该语句的影响。 DELETE NODE ( nodename [, ... ] ) 从groupname指定的NodeGroup中,将指定的节点移除,这些被移除的节点仍然存在于PGXC_NODE系统表中。该语句仅仅修改系统表,不会进行实际的节点移除和数据重分布,用户不应该直接调用该SQL语句。可以在PGXC_GROUP系统表中观察该语句的影响。 RESIZE TO dest_group_name 设置集群resize操作标志,将groupname所表示的NodeGroup设置为重分布的源NodeGroup,并取消is_installation标志;同时将desst_group_name设置为重分布的目的NodeGroup,并设置is_installation标志。
  • 注意事项 只有系统管理员或者被授予了node group的ALTER权限的用户可以修改node group信息。 修改node group操作都是系统内部操作,除了SET DEFAULT语法之外,其他操作都需要在维护模式下(调用set xc_maintenance_mode=on;)。 ALTER NODE GROUP语法仅仅应该在数据库内部使用,使用者不应该手动调用这些SQL语句,否则会导致数据库系统数据不一致。
  • 语法格式 1 2 3 4 5 6 7 8 9 ALTER NODE GROUP groupname { SET DEFAULT | RENAME TO new_group_name | SET TABLE GROUP new_group_name | COPY BUCKETS FROM src_group_name | ADD NODE ( nodename [, ... ] ) | DELETE NODE ( nodename [, ... ] ) | RESIZE TO dest_group_name };
  • 参数说明 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 一个字段的输出名称。 取值范围:字符串,符合标识符命名规范。
  • 示例 删除部分数据 --建表。 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
  • 语法格式 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 ] } [, ...] } ];
共100000条