华为云用户手册

  • 参数说明 schema 指定模式包含的表。如果缺省,则为当前模式。 table_name 指定表名。 TO CS N 指定要返回表的时间点对应的事务提交序列号(CSN)。expr必须计算一个数字,代表有效的CSN。 TO TIMESTAMP 指定要返回表的时间点对应的时间戳。expr必须计算一个过去有效的时间戳(使用TO_TIMESTAMP函数将字符串转换为时间类型)。表将被闪回到指定时间戳大约3秒内的时间点。 说明:闪回点过旧时,因旧版本被回收导致无法获取旧版本,会导致闪回失败并报错:Restore point too old。 TO BEFORE DROP 使用这个子句检索回收站中已删除的表及其子对象。 RENAME TO 为从回收站中检索的表指定一个新名称。 TO BEFORE TRUNCATE 闪回到TRUNCATE之前。
  • 示例 闪回到某个时间点 需要设置undo_retention_time参数,用于设置旧版本undo的保留时间。 参数使用请联系管理员处理。 --建表并插入数据。 gaussdb=# CREATE TABLE tbl_test(c1 int, c2 int); gaussdb=# INSERT INTO tbl_test VALUES (1,1),(2,2),(3,3); --查询当前时间和全局所有节点上的next_csn。 gaussdb=# SELECT now(); now ------------------------------- 2023-11-27 17:06:34.840698+08 (1 row) gaussdb=# SELECT int8in(xidout(next_csn)) FROM gs_get_next_xid_csn(); int8in -------- 25391 (6 row) --修改数据。 gaussdb=# UPDATE tbl_test SET c1=111, c2=222 WHERE c1=1; --查询数据。 gaussdb=# SELECT * FROM tbl_test; c1 | c2 -----+----- 111 | 222 2 | 2 3 | 3 (3 rows) --将数据闪回至修改之前,需要按照实际情况替换时间 gaussdb=# TIMECAPSULE table tbl_test TO TIMESTAMP to_timestamp('2023-11-27 17:06:34.840698','YYYY-MM-DD HH24:MI:SS.FF'); --也可使使用如下SQL。 gaussdb=# TIMECAPSULE table tbl_test TO CSN 25391; gaussdb=# SELECT * FROM tbl_test; c1 | c2 ----+---- 2 | 2 3 | 3 1 | 1 (3 rows) --删除。 gaussdb=# DROP TABLE tbl_test; 从回收站中闪回数据 前提条件: 开启enable_recyclebin参数,启用回收站,参数使用请联系管理员处理。 recyclebin_retention_time参数用于设置回收站对象保留时间,超过该时间的回收站对象将被自动清理,参数使用请联系管理员处理。 --建表并插入数据。 gaussdb=# CREATE TABLE tbl_test1(c1 int, c2 varchar(10)); gaussdb=# INSERT INTO tbl_test1 VALUES (1,'AAA'),(2,'BBB'); --删除表。 gaussdb=# DROP TABLE tbl_test1; --闪回至表删除之前。 gaussdb=# TIMECAPSULE TABLE tbl_test1 TO BEFORE DROP; --查询数据。 gaussdb=# SELECT * FROM tbl_test1; c1 | c2 ----+----- 1 | AAA 2 | BBB (2 rows) --删除表(添加PURGE参数,级联删除回收站该表数据)。 gaussdb=# DROP TABLE tbl_test1 PURGE;
  • 参数说明 WORK | TRANSACTION BEGIN格式中的可选关键字,没有实际作用。 ISOLATION LEVEL 指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。 在事务中第一个数据修改语句(SELECT、INSERT、DELETE、UPDATE、FETCH、COPY)执行之后,事务隔离级别就不能再次设置。 取值范围: READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 REPEATABLE READ: 可重复读隔离级别,仅仅看到事务开始之前提交的数据,它不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 SERIALIZABLE: GaussDB 目前功能上不支持此隔离级别,设置该隔离级别时,等价于REPEATABLE READ。 READ WRITE | READ ONLY 指定事务访问模式(读/写或者只读)。
  • 语法格式 格式一:START TRANSACTION格式 START TRANSACTION [ { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [ ...] ]; 格式二:BEGIN格式 BEGIN [ WORK | TRANSACTION ] [ { ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [ ...] ];
  • 示例 --创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; --创建表tpcds.reason。 gaussdb=# CREATE TABLE tpcds.reason (c1 int, c2 int); --以默认方式启动事务。 gaussdb=# START TRANSACTION; gaussdb=# SELECT * FROM tpcds.reason; gaussdb=# END; --以默认方式启动事务。 gaussdb=# BEGIN; gaussdb=# SELECT * FROM tpcds.reason; gaussdb=# END; --以隔离级别为READ COMMITTED,读/写方式启动事务。 gaussdb=# START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE; gaussdb=# SELECT * FROM tpcds.reason; gaussdb=# COMMIT; --删除表tpcds.reason。 gaussdb=# DROP TABLE tpcds.reason; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds;
  • 参数说明 qualified_name 创建snapshot的名称。 取值范围:字符串,需要符合标识符命名规范。 version (可省略)snapshot的版本号,当省略设置。系统会自动顺延编号。 取值范围:字符串,数字编号配合分隔符。 comment_item 指定添加的评论内容。 取值范围:字符串,需要符合标识符命名规范。 insert_item 需要插入的对象名字。 取值范围:字符串,需要符合标识符命名规范。 alias 对当前对象取的别名。 取值范围:字符串,需要符合标识符命名规范。 set_item 当前操作的对象名。 取值范围:字符串,需要符合标识符命名规范。 from_item 用于连接的查询源对象的名称。 取值范围:字符串,需要符合标识符命名规范。 where_item 返回值为布尔型的任意表达式。 取值范围:字符串,需要符合标识符命名规范。 using_item 用于连接的对象名称。 取值范围:字符串,需要符合标识符命名规范。 and_item 需要并列处理的对象名称。 取值范围:字符串,需要符合标识符命名规范。 drop_item 需要drop的对象名称。 取值范围:字符串,需要符合标识符命名规范。 attr_list 目标对象的list集合。 取值范围:字符串,需要符合标识符命名规范。 num 指定的比例值。 取值范围:数字。
  • 示例 --创建数据表 gaussdb=# CREATE TABLE t1 (id int, name varchar); --插入数据 gaussdb=# INSERT INTO t1 VALUES (1, 'zhangsan'); gaussdb=# INSERT INTO t1 VALUES (2, 'lisi'); gaussdb=# INSERT INTO t1 VALUES (3, 'wangwu'); gaussdb=# INSERT INTO t1 VALUES (4, 'lisa'); gaussdb=# INSERT INTO t1 VALUES (5, 'jack'); --创建快照 gaussdb=# CREATE SNAPSHOT s1@1.0 comment is 'first version' AS SELECT * FROM t1; --迭代创建快照 gaussdb=# CREATE SNAPSHOT s1@2.0 FROM @1.0 comment is 'inherits from @1.0' USING (INSERT VALUES(6, 'john'), (7, 'tim'); DELETE WHERE id = 1); --查看快照内容 gaussdb=#SELECT * FROM DB4AISHOT(s1@1.0); --快照采样 gaussdb=# SAMPLE SNAPSHOT s1@2.0 stratify by name as nick at ratio .5; --删除快照 gaussdb=# PURGE SNAPSHOT s1@2.0; gaussdb=# PURGE SNAPSHOT s1nick@2.0; gaussdb=# PURGE SNAPSHOT s1@1.0; --删除表格 gaussdb=# DROP TABLE t1;
  • 语法格式 创建快照 可以采用“CREATE SNAPSHOT … AS”以及“CREATE SNAPSHOT … FROM”语句创建数据表快照。 CREATE SNAPSHOT AS CREATE SNAPSHOT qualified_name [@ [version]] [COMMENT IS comment_item] AS query; CREATE SNAPSHOT FROM CREATE SNAPSHOT qualified_name [@ [version]] FROM @ version [COMMENT IS comment_item] USING ( { INSERT [INTO SNAPSHOT] insert_item | UPDATE [SNAPSHOT] [AS alias] SET set_item [FROM from_item] [WHERE where_item] | DELETE [FROM SNAPSHOT] [AS alias] [USING using_item] [WHERE where_item] | ALTER [SNAPSHOT] { ADD and_item | DROP drop_item } [, ...] } [; ...] ); 删除快照。 PURGE SNAPSHOT PURGE SNAPSHOT qualified_name @ version; 快照采样。 SAMPLE SNAPSHOT SAMPLE SNAPSHOT qualified_name @ version [STRATIFY BY attr_list] { AS alias AT RATIO num [COMMENT IS comment_item] } [, ...] 快照发布。 PUBLISH SNAPSHOT PUBLISH SNAPSHOT qualified_name @ version; 快照存档。 ARCHIVE SNAPSHOT ARCHIVE SNAPSHOT qualified_name @ version; 查询快照。 SELECT * FROM DB4AISHOT ( qualified_name @ version);
  • 注意事项 本特性GUC参数db4ai_snapshot_mode,快照存储模型分为MSS和 CSS 两种;GUC参数db4ai_snapshot_version_delimiter,用于设定版本分隔符,仅接受设定单字节参数值,默认为“@”;GUC参数db4ai_snapshot_version_separator,用于设定子版本分隔符,仅接受设定单字节参数值,默认为“.”。 当快照选用增量存储方式时,各个快照中具有依赖关系。删除快照需要按照依赖顺序进行删除。 snapshot特性用于团队不同成员间维护数据,涉及管理员和普通用户之间的数据转写。所以在三权分立(enableSeparationOfDuty=ON)等状态下,数据库不支持snapshot功能特性。 当需要稳定可用的快照用于AI训练等任务时,用户需要将快照发布。
  • 示例 --创建并切换至测试数据库。 gaussdb=# CREATE DATABASE test_event WITH DBCOMPATIBILITY = 'b'; test_event=# \c test_event --创建SCHEMA。 test_event=# CREATE SCHEMA test; --创建表。 test_event=# CREATE TABLE t_ev(num int); --创建一个默认当前SCHEMA的定时任务。 test_event=# CREATE EVENT IF NOT EXISTS event_e2 ON SCHEDULE EVERY 1 minute DO insert into t_ev values(1); --创建一个SCHEMA为test的定时任务。 test_event=# CREATE EVENT IF NOT EXISTS test.event_e3 ON SCHEDULE EVERY 1 minute DO insert into t_ev values(2); --查看所有定时任务。 test_event=# SHOW EVENTS; job_name | schema_name | log_user | priv_user | job_status | start_date | interval | end_date | enable | failure_msg ----------+-------------+----------+-----------+------------+----------------------------+----------------------+---------------------+--------+------------------------------- event_e2 | public | omm | omm | s | 2023-11-28 10:13:48.675215 | interval '1' minute | 3999-12-31 16:00:00 | t | (1 rows) --查看SCHEMA为test的定时任务。 test_event=# SHOW EVENTS FROM test; job_name | schema_name | log_user | priv_user | job_status | start_date | interval | end_date | enable | failure_msg ----------+-------------+----------+-----------+------------+----------------------------+----------------------+---------------------+--------+--------------------------------event_e3 | test | omm | omm | s | 2023-11-28 10:29:42.327827 | interval '1' minute | 3999-12-31 16:00:00 | t | (1 row) --删除定时任务。 test_event=# DROP EVENT event_e2; test_event=# DROP EVENT test.event_e3; --删除表。 test_event=# DROP TABLE t_ev; --删除SCHEMA。 test_event=# DROP SCHEMA test; --切换回初始数据库,并删除测试数据库。请用真实的数据库名替换postgres。 test_event=# \c postgres gaussdb=# DROP DATABASE test_event;
  • 参数说明 LOCAL 声明该命令只在当前事务中有效。 SESSION 声明这个命令只对当前会话起作用。 SET SESSION TRANSACTION语句需要在sql_compatibility = 'B'场景下,设置GUC参数b_format_behavior_compat_options为set_session_transaction后生效,作用等同于SET SESSION CHARACTERIS TICS AS TRANSACTION语句。 GLOBAL 声明这个命令对当前数据库的全局会话生效。 作用范围:在sql_compatibility = 'B'场景下生效。对后续连接的会话生效。 SESSION CHARACTERISTICS 声明这个命令只对当前会话起作用。 ISOLATION LEVEL 指定事务隔离级别,该参数决定当一个事务中存在其他并发运行事务时能够看到什么数据。 在事务中第一个数据修改语句(SELECT、INSERT、DELETE、UPDATE、FETCH、COPY)执行之后,当前事务的隔离级别就不能再次设置。 事务块内SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL对当前事务不生效,需要COMMIT之后才生效。 取值范围: READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 REPEATABLE READ:可重复读隔离级别,仅仅能看到事务开始之前提交的数据,不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 SERIALIZABLE:GaussDB目前功能上不支持此隔离级别,等价于REPEATABLE READ。 READ WRITE | READ ONLY 指定事务访问模式(读/写或者只读)。
  • 示例 --创建并切换至测试数据库。 gaussdb=# CREATE DATABASE mysql_compatible_db DBCOMPATIBILITY 'B'; gaussdb=# \c mysql_compatible_db --开启一个事务,设置事务的隔离级别为READ COMMITTED,访问模式为READ ONLY。 gaussdb=# START TRANSACTION; gaussdb=# SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY; gaussdb=# COMMIT; --设置当前会话的事务隔离级别、读写模式。 --在sql_compatibility = 'B'场景下,b_format_behavior_compat_options设置为set_session_transaction。 gaussdb=# SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; gaussdb=# SET SESSION TRANSACTION READ ONLY; --给sql_compatibility = 'B'的数据库设置全局会话的事务隔离级别、读写模式(当前只能在sql_compatibility = 'B'场景下)。 gaussdb=# SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; gaussdb=# SET GLOBAL TRANSACTION READ ONLY; --切换回初始数据库,并删除测试数据库。请用真实的数据库名替换postgres。 gaussdb=# \c postgres gaussdb=# DROP DATABASE mysql_compatible_db;
  • 参数说明 SESSION 声明这个命令只对当前会话起作用。 LOCAL 声明该命令只在当前事务中有效。 role_name 用户名。 取值范围:字符串,数据库中已经存在的用户名。 password 角色的密码。要求符合密码的命名规则。 使用密文密码限制如下: 管理员用户不能使用密文密码切换到其他管理员用户,只能向权限更低用户切换; 使用密文密码通常用于gs_dump、gs_dumpall导出场景,其他场景不建议直接使用密文密码。 DEFAULT 重置会话和当前用户标识符为初始认证的用户名。
  • 功能描述 SET CONSTRAINTS设置当前事务检查行为的约束条件。 IMMEDIATE约束是在每条语句后面进行检查。DEFERRED约束一直到事务提交时才检查。每个约束都有自己的模式。 从创建约束条件开始,一个约束总是设定为DEFERRABLE INITIALLY DEFERRED、DEFERRABLE INITIALLY IMMEDIATE和NOT DEFERRABLE三个特性之一。第三种总是IMMEDIATE,并且不会受SET CONSTRAINTS影响。前两种以指定的方式启动每个事务,但是其行为可以在事务里用SET CONSTRAINTS改变。 带着一个约束名列表的SET CONSTRAINTS改变这些约束的模式(都必须是可推迟的)。如果有多个约束匹配某个名称,则所有都会被影响。SET CONSTRAINTS ALL改变所有可推迟约束的模式。 当SET CONSTRAINTS把一个约束从DEFERRED改成IMMEDIATE的时候,任何将在事务结束准备进行的数据修改都将在SET CONSTRAINTS的时候执行检查。如果违反了任何约束,SET CONSTRAINTS都会失败(并且不会修改约束模式)。因此,SET CONSTRAINTS可以用于强制在事务中某一点进行约束检查。
  • 示例 --设置模式搜索路径。 gaussdb=# SET search_path TO tpcds, public; --把日期时间风格设置为传统的 POSTGRES 风格(日在月前)。 gaussdb=# SET datestyle TO postgres,dmy; --SET自定义用户变量的功能。 gaussdb=# CREATE DATABASE user_var dbcompatibility 'b'; gaussdb=# \c user_var user_var=# SET b_format_behavior_compat_options = enable_set_variables; user_var=# SET @v1 := 1, @v2 := 1.1, @v3 := true, @v4 := 'dasda', @v5 := x'41'; --查询自定义用户变量。 user_var=# SELECT @v1, @v2, @v3, @v4, @v5, @v6, @v7; --PREPARE语法使用自定义用户变量。 user_var=# SET @sql = 'select 1'; user_var=# PREPARE stmt as @sql; user_var=# EXECUTE stmt; user_var=# \q --删除数据库。 gaussdb=# DROP DATABASE user_var;
  • 参数说明 SESSION 声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。 如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。 LOCAL 声明的参数只在当前事务中有效。在COMMIT或ROLLBACK之后,会话级别的设置将再次生效。 不论事务是否提交,此命令的影响只持续到当前事务结束。一个特例是:在一个事务里面,既有SET命令,又有SET LOCAL命令,且SET LOCAL在SET后面,则在事务结束之前,SET LOCAL命令会起作用,但事务提交之后,则是SET命令会生效。 TIME ZONE timezone 用于指定当前会话的本地时区。 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 CURRENT_SCHEMA schema CURRENT_SCHEMA用于指定当前的模式。 取值范围:已存在模式名称。如果模式名不存在,会导致CURRENT_SCHEMA值为空。 SCHEMA schema 同CURRENT_SCHEMA。此处的schema是个字符串。 例如:set schema 'public'; NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT}; 在B兼容模式下,并在设置b_format_version='5.7'、b_format_dev_version='s2';时,支持指定collate子句。 用于设置客户端字符编码,常量字符串的字符集、字符序,及返回结果的字符集。 等价于: set client_encoding = charset_name; set character_set_connection = charset_name; set collation_connection = collation_name; set character_set_results = charset_name; 取值范围:B兼容模式下支持的字符集,字符序。暂不支持指定charset_name与数据库字符集不同。 其他场景下不支持指定collate子句。 用于设置客户端的字符编码。 等价于: set client_encoding to charset_name 取值范围:有效的字符编码。该选项对应的运行时参数名称为client_encoding,默认编码为UTF8。 config_parameter 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。 部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。 value config_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。 SESSION | @@SESSION. | @@ 声明的参数生效方式为superuser、user,可通过pg_settings系统视图的context字段确定,如果没有出现GLOBAL /SESSION,则SESSION为缺省值。支持config_parameter赋值为表达式。 SET SESSION 只有在兼容B模式下(sql_compatibility = 'B')支持,并且GUC参数b_format_behavior_compat_options设置值包含 enable_set_variables的场景下才支持(set b_format_behavior_compat_options = 'enable_set_variables')。 使用@@config_parameter进行操作符运算时,尽量使用空格隔开。比如set @@config_parameter1=@@config_parameter1*2; 命令中,会将=@@当做操作符,可将其修改为set @@config_parameter1= @@config_parameter1 * 2 。
  • 语法格式 设置所处的时区。 SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }; 设置所属的模式。 SET [ SESSION | LOCAL ] {CURRENT_SCHEMA { TO | = } { schema | DEFAULT } | SCHEMA 'schema'}; 设置客户端编码集。 SET [ SESSION | LOCAL ] NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT}; 设置其他运行时参数。 SET [ SESSION | LOCAL ] {config_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }};
  • 语法格式 [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] { * | {expression [ [ AS ] output_name ]} [, ...] } INTO [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UN LOG GED ] [ TABLE ] new_table [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ WINDOW {window_name AS ( window_definition )} [, ...] ] [ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT |WAIT N]} [...] ];
  • 参数说明 new_table new_table指定新建表的名称。 UNLOGGED 指定表为非日志表。非日志表中写入的数据不会被写入到预写日志中,比普通表快很多。但是,非日志表在冲突或异常关机后会被自动删截,非日志表中的内容也不会被复制到备用服务器中,在该类表中创建的索引也不会被自动记录。 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 GLOBAL | LOCAL 创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。如果指定GLOBAL关键字,GaussDB会创建全局临时表,否则GaussDB会创建本地临时表。 TEMPORARY | TEMP 如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表分为全局临时表和本地临时表两种类型。创建临时表时如果指定GLOBAL关键字则为全局临时表,否则为本地临时表。 全局临时表的元数据对所有会话可见,会话结束后元数据继续存在。会话与会话之间的用户数据、索引和统计信息相互隔离,每个会话只能看到和更改自己提交的数据。全局临时表有两种模式:一种是基于会话级别的(ON COMMIT PRESERVE ROWS),当会话结束时自动清空用户数据;一种是基于事务级别的(ON COMMIT DELETE ROWS),当执行commit或rollback时自动清空用户数据。建表时如果没有指定ON COMMIT选项,则缺省为会话级别。与本地临时表不同,全局临时表建表时可以指定非pg_temp_开头的schema。 本地临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。 本地临时表通过每个会话独立的以pg_temp_开头的schema来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg_temp_、pg_toast_temp_开头的schema。 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的schema为当前会话的pg_temp_开头的schema,则此表会被创建为临时表。 如果其它会话正在使用全局临时表或索引,则无法对其执行ALTER/DROP操作。 全局临时表的DDL只会影响当前会话的用户数据和索引。例如truncate、reindex、analyze只对当前会话有效。 SELECT INTO的其它参数可参考SELECT的参数说明。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 --建表并插入数据。 gaussdb=# CREATE TABLE tbl_person ( id integer, name varchar(20), sex varchar(5) CHECK(sex = '男' or sex = '女') ); gaussdb=# INSERT INTO tbl_person VALUES (1, 'Bob', '男'),(2, 'Anne', '女'),(3, 'Jack', '男'),(4, 'Danny', '男'),(5, 'Alice', '女'),(6, 'Susan', '女'); --将person表中所有男生的信息加入到新表中 gaussdb=# SELECT * INTO tbl_man FROM tbl_person WHERE sex = '男'; --查询tbl_man数据。 gaussdb=# SELECT * FROM tbl_man; id | name | sex ----+-------+----- 1 | Bob | 男 3 | Jack | 男 4 | Danny | 男 (3 rows) --删除表。 gaussdb=# DROP TABLE tbl_person, tbl_man;
  • 行转列与列转行 行转列 --建表并插入数据。 gaussdb=# CREATE TABLE test_p2(id INT, class VARCHAR(20), score INT); gaussdb=# INSERT INTO test_p2 VALUES (1,'math',64), (1,'english',78); gaussdb=# INSERT INTO test_p2 VALUES (2,'math',98), (2,'english',82); gaussdb=# INSERT INTO test_p2 VALUES (3,'math',68), (3,'english',59); gaussdb=# SELECT * FROM test_p2; id | class | score ----+---------+------- 3 | math | 68 3 | english | 59 1 | math | 64 1 | english | 78 2 | math | 98 2 | english | 82 (6 rows) --行转列。 gaussdb=# SELECT * FROM test_p2 PIVOT(MAX(score) FOR class IN('math','english')); id | 'math' | 'english' ----+--------+----------- 3 | 68 | 59 1 | 64 | 78 2 | 98 | 82 (3 rows) --删除。 gaussdb=# DROP TABLE test_p2; 列转行 --建表并插入数据。 gaussdb=# CREATE TABLE test_p1(id INT, math INT, english INT); gaussdb=# INSERT INTO test_p1 VALUES (1,84,78), (2,98,82), (3,68,59); gaussdb=# SELECT * FROM test_p1; id | math | english ----+------+--------- 3 | 68 | 59 1 | 84 | 78 2 | 98 | 82 (3 rows) --列转行。 gaussdb=# SELECT * FROM test_p1 UNPIVOT(score FOR class IN(math, english)); id | class | score ----+---------+------- 3 | MATH | 68 3 | ENGLISH | 59 1 | MATH | 84 1 | ENGLISH | 78 2 | MATH | 98 2 | ENGLISH | 82 (6 rows) --删除。 gaussdb=# DROP TABLE test_p1; 父主题: SELECT
  • 示例 --建表并插入数据。 gaussdb=# CREATE TABLE test1(c11 INT, c12 VARCHAR); gaussdb=# INSERT INTO test1 VALUES (1,'a'),(2,'b'),(4,'d'); gaussdb=# CREATE TABLE test2(c21 INT, c22 VARCHAR); gaussdb=# INSERT INTO test2 VALUES (1,'a'),(3,'c'); UNION gaussdb=# SELECT * FROM test1 UNION SELECT * FROM test2; c11 | c12 -----+----- 1 | a 4 | d 2 | b 3 | c (4 rows) UNION ALL gaussdb=# SELECT * FROM test1 UNION ALL SELECT * FROM test2; c11 | c12 -----+----- 1 | a 2 | b 4 | d 1 | a 3 | c (5 rows) INTERSECT gaussdb=# SELECT * FROM test1 INTERSECT SELECT * FROM test2; c11 | c12 -----+----- 1 | a (1 row) MINUS gaussdb=# SELECT * FROM test1 MINUS SELECT * FROM test2; c11 | c12 -----+----- 4 | d 2 | b (2 rows) -- 删除。 gaussdb=# DROP TABLE test1,test2;
  • 分区查询 查询指定分区的数据。 --创建范围分区表。 gaussdb=# CREATE TABLE test_range1( id INT, info VARCHAR(20) ) PARTITION BY RANGE (id) ( PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (400), PARTITION p3 VALUES LESS THAN (600), PARTITION p4 VALUES LESS THAN (800), PARTITION pmax VALUES LESS THAN (MAXVALUE) ); --插入1000数据。 gaussdb=# INSERT INTO test_range1 VALUES(GENERATE_SERIES(1,1000),'abcd'); -- 查询p1分区有多少条数据。 gaussdb=# SELECT COUNT(*) FROM test_range1 PARTITION (p1); count ------- 199 (1 row) -- 删除。 gaussdb=# DROP TABLE test_range1; 父主题: SELECT
  • 注意事项 不能回滚到一个未定义的保存点,语法上会报错。 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个FETCH命令影响,而这个保存点稍后回滚了,那么这个游标的位置仍然在FETCH让它指向的位置(FETCH不会被回滚)。关闭一个游标的行为也不会被回滚给撤消掉。如果一个游标的操作导致事务回滚,那么这个游标就会置于不可执行状态,所以,尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复,但是游标不能再使用了。 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。
  • 示例 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 --开启事务。 gaussdb=# START TRANSACTION; --设置保存点my_savepoint。 gaussdb=# SAVEPOINT my_savepoint; --回滚至保存点my_savepoint。 gaussdb=# ROLLBACK TO SAVEPOINT my_savepoint; --游标位置不受保存点回滚的影响。 gaussdb=# DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; --设置保存点foo。 gaussdb=# SAVEPOINT foo; --读取一条数据,为第一条数据。 gaussdb=# FETCH 1 FROM foo; ?column? ---------- 1 --回滚至保存点foo。 gaussdb=# ROLLBACK TO SAVEPOINT foo; --读取一条数据,为第二条数据。 gaussdb=# FETCH 1 FROM foo; ?column? ---------- 2 --释放保存点。 gaussdb=# RELEASE SAVEPOINT my_savepoint; --结束事务。 gaussdb=# COMMIT;
  • 修改表示例 单表修改名称 gaussdb=# CREATE TABLE aa(c1 int, c2 int); gaussdb=# RENAME TABLE aa TO test_alt1; gaussdb=# DROP TABLE test_alt1; 多个表修改名称 gaussdb=# CREATE TABLE aa(c1 int, c2 int); gaussdb=# CREATE TABLE bb(c1 int, c2 int); gaussdb=# RENAME TABLE aa TO test_alt1, bb TO test_alt2; gaussdb=# DROP TABLE test_alt1,test_alt2;
  • 示例 --开始。 gaussdb=# BEGIN; BEGIN --准备标识符为的trans_test的事务。 gaussdb=# PREPARE TRANSACTION 'trans_test'; PREPARE TRANSACTION --取消标识符为的trans_test的事务。 gaussdb=# ROLLBACK PREPARED 'trans_test'; ROLLBACK PREPARED
  • 示例 -- 创建目标表products和源表newproducts,并插入数据 gaussdb=# CREATE TABLE products ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); gaussdb=# INSERT INTO products VALUES (1501, 'vivitar 35mm', 'electrncs'); gaussdb=# INSERT INTO products VALUES (1502, 'olympus is50', 'electrncs'); gaussdb=# INSERT INTO products VALUES (1600, 'play gym', 'toys'); gaussdb=# INSERT INTO products VALUES (1601, 'lamaze', 'toys'); gaussdb=# INSERT INTO products VALUES (1666, 'harry potter', 'dvd'); gaussdb=# CREATE TABLE newproducts ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); gaussdb=# INSERT INTO newproducts VALUES (1502, 'olympus camera', 'electrncs'); gaussdb=# INSERT INTO newproducts VALUES (1601, 'lamaze', 'toys'); gaussdb=# INSERT INTO newproducts VALUES (1666, 'harry potter', 'toys'); gaussdb=# INSERT INTO newproducts VALUES (1700, 'wait interface', 'books'); -- 进行MERGE INTO操作 gaussdb=# MERGE INTO products p USING newproducts np ON (p.product_id = np.product_id) WHEN MATCHED THEN UPDATE SET p.product_name = np.product_name, p.category = np.category WHERE p.product_name != 'play gym' WHEN NOT MATCHED THEN INSERT VALUES (np.product_id, np.product_name, np.category) WHERE np.category = 'books'; MERGE 4 -- 查询更新后的结果 gaussdb=# SELECT * FROM products ORDER BY product_id; product_id | product_name | category ------------+----------------+----------- 1501 | vivitar 35mm | electrncs 1502 | olympus camera | electrncs 1600 | play gym | toys 1601 | lamaze | toys 1666 | harry potter | toys 1700 | wait interface | books (6 rows) -- 删除表 gaussdb=# DROP TABLE products; gaussdb=# DROP TABLE newproducts;
  • 示例 SHARE ROW EXCLUSIVE --创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; --创建表tpcds.reason。 gaussdb=# CREATE TABLE tpcds.reason ( r_reason_sk INTEGER NOT NULL, r_reason_id CHAR(16) NOT NULL, r_reason_desc INTEGER ); --向表中插入多条记录。 gaussdb=# INSERT INTO tpcds.reason VALUES (1, 'AAAAAAAABAAAAAAA', '18'),(5, 'AAAAAAAACAAAAAAA', '362'),(7, 'AAAAAAAADAAAAAAA', '585'); --创建一个新表reason_t1。 gaussdb=# CREATE TABLE tpcds.reason_t1 AS TABLE tpcds.reason; --开启事务。 gaussdb=# START TRANSACTION; --使用SHARE ROW EXCLUSIVE MODE锁模式锁表。 gaussdb=# LOCK TABLE tpcds.reason_t1 IN SHARE ROW EXCLUSIVE MODE; --在另一个终端执行DELETE操作会发现阻塞。 gaussdb=# DELETE FROM tpcds.reason_t1 WHERE r_reason_sk = 7; --结束事务,释放锁。 gaussdb=# COMMIT; ROW EXCLUSIVE --开启事务。 gaussdb=# START TRANSACTION; --执行update语句后,在被引用的表上请求一个ROW EXCLUSIVE锁。 gaussdb=# UPDATE tpcds.reason_t1 SET r_reason_desc=180 WHERE r_reason_sk=1; --在另外一个终端alter table语句,出现阻塞。 gaussdb=# ALTER TABLE tpcds.reason_t1 ADD r_reason_asc int; --结束事务,释放锁。 gaussdb=# COMMIT; AC CES S EXCLUSIVE --开启事务。 gaussdb=# START TRANSACTION; --执行TRUNCATE语句后,在被引用的表上请求一个ACCESS SHARE锁。 gaussdb=# TRUNCATE tpcds.reason_t1; --在另一个终端执行select语句,出现阻塞。 gaussdb=# SELECT * FROM tpcds.reason_t1; --结束事务,释放锁。 gaussdb=# COMMIT; --删除表tpcds.reason_t1。 gaussdb=# DROP TABLE tpcds.reason_t1; --删除表tpcds.reason。 gaussdb=# DROP TABLE tpcds.reason; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 注意事项 LOCK TABLE只能在一个事务块的内部有用,因为锁在事务结束时就会被释放。出现在任意事务块外面的LOCK TABLE都会报错。 如果没有声明锁模式,缺省为最严格的模式ACCESS EXCLUSIVE。 LOCK TABLE ... IN ACCESS SHARE MODE需要在目标表上有SELECT权限。所有其他形式的LOCK需要UPDATE或DELETE权限。 没有UNLOCK TABLE命令,锁总是在事务结束时释放。 LOCK TABLE只处理表级的锁,因此那些带“ROW”字样的锁模式都是有歧义的。这些模式名称通常可理解为用户试图在一个被锁定的表中获取行级的锁。同样,ROW EXCLUSIVE模式也是一个可共享的表级锁。注意,只要是涉及到LOCK TABLE ,所有锁模式都有相同的语意,区别仅在于规则中锁与锁之间是否冲突,规则请参见表1。 如果没有打开xc_maintenance_mode参数,那么对系统表申请ACCESS EXCLUSIVE级别锁将报错。
共100000条