云服务器内容精选

  • 参数说明 table_name 要插入数据的目标表名。 取值范围:已存在的表名。 col_name 目标表中的字段名。 字段名可以由子字段名或者数组下标修饰。 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据,那么其他字段将是NULL。 目标字段(col_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 如果VALUE子句和QUERY中只提供了N个字段,则目标字段为前N个字段。 VALUE子句和QUERY提供的值在表中从左到右关联到对应列。 取值范围:已存在的字段名。 PARTITION ( partition_name [, ... ] ) 指定分区插入操作。其中partition_name为分区名。 如果VALUE子句的值和指定分区不一致,结果会提示异常。 value 待插入的值,value格式为: { expression | DEFAULT } expression表示赋予对应列一个有效表达式或值 向表中字段插入单引号 " ' "时需要使用单引号自身进行转义。 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 DEFAULT表示对应字段名的缺省值。如果没有缺省值,则为NULL。 query 一个查询语句(SELECT语句),将查询结果作为插入的数据。
  • 示例 --创建一个新表test。 gaussdb=# CREATE TABLE test(f1 int primary key, f2 int, f3 int); --插入3条数据。 gaussdb=# INSERT INTO test VALUES(1, 1, 1), (2, 2, 2), (3, 3, 3); INSERT 0 3 --值替换插入数据。 gaussdb=# REPLACE INTO test VALUES(1, 11, 11); REPLACE 0 2 --查询值替换插入的结果。 gaussdb=# SELECT * FROM test WHERE f1 = 1; f1 | f2 | f3 ----+----+---- 1 | 11 | 11 (1 row) --查询替换插入数据。 gaussdb=# REPLACE INTO test SELECT 2, 22, 22; REPLACE 0 2 --查询查询替换插入的结果。 gaussdb=# SELECT * FROM test WHERE f1 = 2; f1 | f2 | f3 ----+----+---- 2 | 22 | 22 (1 row) --设置指定字段替换插入数据。 gaussdb=# REPLACE INTO test SET f1 = f1 + 3, f2 = f1 * 10 + 3, f3 = f2; REPLACE 0 2 --查询设置指定字段替换插入数据的结果。 gaussdb=# SELECT * FROM test WHERE f1 = 3; f1 | f2 | f3 ----+----+---- 3 | 33 | 33 (1 row) --删除表格test。 gaussdb=# DROP TABLE test;
  • 语法格式 值替换插入。 REPLACE [ INTO ] table_name [ PARTITION ( partition_name [, ... ] ) ] [ ( col_name [, ... ] ) ] { VALUES | VALUE } ( value [, ... ] ) [, ... ]; --其中value的格式为: { expression | DEFAULT } 查询替换插入。 REPLACE [ INTO ] table_name [ PARTITION ( partition_name [, ... ] ) ] [ ( col_name [, ... ]) ] query; 设置指定字段值。 REPLACE [ INTO ] table_name [ PARTITION ( partition_name [, ... ] ) ] SET col_name = value [, ... ]; --其中value的格式为: { expression | DEFAULT }
  • 示例 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 --创建表tbl_test,并插入数据。 gaussdb=# CREATE TABLE tbl_test(c1 int,c2 varchar); gaussdb=# INSERT INTO tbl_test VALUES (1, 'AAAAAAA'),(5, 'AAAAAAB'),(10, 'AAAAAAC'); --创建索引,并查看索引大小 gaussdb=# CREATE INDEX idx_test_c1 ON tbl_test(c1); gaussdb=# SELECT pg_size_pretty(pg_total_relation_size('idx_test_c1')) AS size; size -------- 176 kB (1 row) --插入一万条数据,然后删除数据,发现索引变大。 gaussdb=# INSERT INTO tbl_test VALUES (generate_series(1,10000),'test'); gaussdb=# DELETE FROM tbl_test WHERE c2 = 'test'; gaussdb=# SELECT pg_size_pretty(pg_total_relation_size('idx_test_c1')) AS size; size -------- 504 kB (1 row) --重建一个单独索引之后,查看索引信息索引大小变回初始大小。 gaussdb=# REINDEX INDEX idx_test_c1; gaussdb=# SELECT pg_size_pretty(pg_total_relation_size('idx_test_c1')) AS size; size -------- 176 kB (1 row) --在线重建一个单独索引。 gaussdb=# REINDEX INDEX CONCURRENTLY idx_test_c1; --重建表tbl_test上的所有索引。 gaussdb=# REINDEX TABLE tbl_test; --在线重建表tbl_test上的所有索引。 gaussdb=# REINDEX TABLE CONCURRENTLY tbl_test; --删除tbl_test表。 gaussdb=# DROP TABLE tbl_test;
  • 参数说明 INDEX 重新建立指定的索引。 TABLE 重新建立指定表的所有索引,如果表有从属的“TOAST”表,则这个表也会重建索引。如果表上有索引已经被alter unusable失效,则这个索引无法被重新创建。当指定CONCURRENTLY选项时,暂不支持重建从属“TOAST”表上的索引。 DATABASE 重建当前数据库里的所有索引。当指定CONCURRENTLY选项时,暂不支持重建数据库中表的从属“TOAST”表上的索引。 SYSTEM 在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。 option 当前仅支持CROSSBUCKET一种option,且值只能为ON或OFF,用来控制hash bucket表的索引是否在REINDEX过程中转换为跨bucket索引(cross-bucket-index,CBI)或bucket本地索引(local-bucket-index,LBI)索引。此项转换仅支持分布式hash bucket表的索引,不支持GSI索引,当前版本仅标记了扩容流程的Session可以使用在线索引类型转换。 CONCURRENTLY 以不阻塞DML的方式重建索引(加ShareUpdateExclusiveLock锁)。重建索引时,一般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现重建过程中不阻塞DML。不支持在线重建系统表上的索引。不支持REINDEX INTERNAL TABLE CONCURRENTLY和REINDEX SYSTEM CONCURRENTLY,不支持REINDEX INVALID INDEX CONCURRENTLY。当执行REINDEX DATABASE CONCURRENTLY时,在线重建当前数据库中用户表上的所有索引(不会处理系统表上的索引)。REINDEX CONCURRENTLY不可以在事务内执行。在线重建索引只支持B-tree索引和UB-tree索引,只支持普通索引、GLOBAL索引、LOCAL索引,不支持PCR ubtree索引,不支持二级分区。GSI支持通过REINDEX INDEX CONCURRENTLY在线重建,但不支持在线重建表达式GSI、部分GSI。GSI在线重建期间,应尽量避免与其他DDL并发执行,可能会出现死锁、报错等,可以重新连接客户端进行重试。在线并行重建索引只支持Astore及Ustore的普通索引、GLOBAL索引、LOCAL索引、Ustore的GSI,其他继承当前版本在线重建索引规格约束。如果在线重建索引失败,对于用户手动取消、唯一索引键值重复、资源不足、启动线程失败、锁超时等场景,为避免占用资源,系统会自动清理新索引,在系统无法自动清理失败新索引的情况下(比如数据库宕机、FATAL、PANIC),需要尽快手动清除(使用DROP INDEX语句)非法新索引及(使用DROP TABLE语句)临时表,以防占用更多资源。一般来说,非法的新索引的后缀名为_ccnew,对于GSI(全局二级索引),非法的新索引前缀为ccgsi_tmp_index_。分布式中只有data node节点会自动清理失败索引,coordinator node节点的失败索引需要手动清理。严重错误场景会导致分布式部分节点中找不到失败索引的元信息,DROP INDEX语句无法删除这些索引,需要用DROP INDEX IF EXISTS删除。REINDEX INDEX CONCURRENTLY对表加4级会话锁,且其前几个阶段与CREATE INDEX CONCURRENTLY相似,因此也可能产生卡住或死锁的问题,具体场景与CREATE INDEX CONCURRENTLY相似(比如两个会话同时对同一个索引或表进行REINDEX CONCURRENTLY操作,会引发死锁问题),详见CONCURRENTLY章节。 重建索引时指定此关键字,Astore需要执行先后两次对全表的扫描来完成build,第一次扫描时创建新索引,不阻塞读写操作,第二次扫描时合并更新第一次扫描到目前为止发生的变更;Ustore需完成一次全表扫描,在扫描过程中并发DML产生的数据会被插入到以“index_oid_cctmp”命名的临时表中,扫描结束后合并临时表到以“_ccnew{n}”为后缀名(对于全局二级索引,以“ccgsi_tmp_index_”为前缀名)的新索引中并删除临时表,交换新旧索引,旧索引标记为死亡,启用新索引,重建索引完成。 name 需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。 REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。 FORCE 废弃选项,仅为保持前向兼容,故继续保留。 partition_name 需要重建索引的索引的名称或者表的名称。 取值范围: 如果前面是REINDEX INDEX,则这里应该指定索引的名称; 如果前面是REINDEX TABLE,则这里应该指定表的名称; REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。 REINDEX、REINDEX CONCURRENTLY不支持单独操作toast表或toast索引。
  • 语法格式 重建普通索引。 1 REINDEX { INDEX | [INTERNAL] TABLE | DATABASE | SYSTEM } [ CONCURRENTLY ] name [ FORCE ]; 重建索引并进行类型转换。 1 REINDEX [ ( option [, ...] ) ] { INDEX } [ CONCURRENTLY ] name [ FORCE ]; 重建索引分区。 1 2 REINDEX { INDEX | [INTERNAL] TABLE } name PARTITION partition_name [ FORCE ];
  • 注意事项 REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。 对于全局二级索引,当前仅支持REINDEX INDEX和REINDEX TABLE。 若索引带有lpi_parallel_method选项,取值为PARTITION且表的parallel_workers选项大于0时,不支持对该索引并行重建;无该选项或选项取值为AUTO时,并行重建时会默认走页面级并行重建索引。详见LPI_PARALLEL_METHOD。 REINDEX CONCURRENTLY在线重建索引导致表上索引顺序改变时,可能会导致查询计划改变。
  • 示例 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;
  • 注意事项 不能回滚到一个未定义的保存点,语法上会报错。 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个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 34 35 36 37 38 39 40 41 42 43 44 45 --创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; --创建一个新表。 gaussdb=# CREATE TABLE tpcds.table1(a int); --开启事务。 gaussdb=# START TRANSACTION; --插入数据。 gaussdb=# INSERT INTO tpcds.table1 VALUES (3); --建立保存点。 gaussdb=# SAVEPOINT my_savepoint; --插入数据。 gaussdb=# INSERT INTO tpcds.table1 VALUES (4); --删除保存点。 gaussdb=# RELEASE SAVEPOINT my_savepoint; --查询表的内容,会同时看到3和4。 gaussdb=# SELECT * FROM tpcds.table1; a --- 3 4 (2 rows) --提交事务。 gaussdb=# COMMIT; --再次查询表的内容,会同时看到3和4。 gaussdb=# SELECT * FROM tpcds.table1; a --- 3 4 (2 rows) --删除表。 gaussdb=# DROP TABLE tpcds.table1; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 功能描述 RELEASE SAVEPOINT删除一个当前事务先前定义的保存点。 把一个保存点删除就令其无法作为回滚点使用,除此之外它没有其它用户可见的行为。它并不能撤销在保存点建立起来之后执行的命令的影响,要撤销那些命令可以使用ROLLBACK TO SAVEPOINT 。当不再需要的时候删除一个保存点可以令系统在事务结束之前提前回收一些资源。 RELEASE SAVEPOINT也删除所有在指定的保存点建立之后的所有保存点。
  • 示例 --创建一个普通表。 gaussdb=# CREATE TABLE my_table (c1 int, c2 int) WITH(STORAGE_TYPE=ASTORE); --创建全量物化视图。 gaussdb=# CREATE MATERIALIZED VIEW my_mv AS SELECT * FROM my_table; --创建增量物化视图。 gaussdb=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table; --基表写入数据。 gaussdb=# INSERT INTO my_table VALUES(1,1),(2,2); --对全量物化视图my_mv进行全量刷新。 gaussdb=# REFRESH MATERIALIZED VIEW my_mv; --对增量物化视图my_imv进行全量刷新。 gaussdb=# REFRESH MATERIALIZED VIEW my_imv; --删除增量物化视图。 gaussdb=# DROP MATERIALIZED VIEW my_imv; --删除全量物化视图。 gaussdb=# DROP MATERIALIZED VIEW my_mv; --删除表my_table。 gaussdb=# DROP TABLE my_table;
  • 示例 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 --创建test_jim和test_tom用户。 gaussdb=# CREATE USER test_jim PASSWORD '********'; gaussdb=# CREATE USER test_tom PASSWORD '********'; --查看自动创建的模式的拥有者为同名的用户。 gaussdb=# \dn test* List of schemas Name | Owner ----------+---------- test_jim | test_jim test_tom | test_tom (2 rows) --将所有test_jim拥有的数据库对象的属主更改为test_tom。 gaussdb=# REASSIGN OWNED BY test_jim TO test_tom; --查看schema的信息,test_jim模式的属主更换为test_tom。 gaussdb=# \dn test* List of schemas Name | Owner ----------+---------- test_jim | test_tom test_tom | test_tom (2 rows) --删除test_jim和test_tom用户。 gaussdb=# DROP USER test_jim, test_tom CASCADE;
  • 示例 --创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; --创建一个新表。 gaussdb=# CREATE TABLE tpcds.table1(a int); --开启事务。 gaussdb=# START TRANSACTION; --插入数据。 gaussdb=# INSERT INTO tpcds.table1 VALUES (3); --建立保存点。 gaussdb=# SAVEPOINT my_savepoint; --插入数据。 gaussdb=# INSERT INTO tpcds.table1 VALUES (4); --删除保存点。 gaussdb=# RELEASE SAVEPOINT my_savepoint; --查询表的内容,会同时看到3和4。 gaussdb=# SELECT * FROM tpcds.table1; a --- 3 4 (2 rows) --提交事务。 gaussdb=# COMMIT; --再次查询表的内容,会同时看到3和4。 gaussdb=# SELECT * FROM tpcds.table1; a --- 3 4 (2 rows) --删除表。 gaussdb=# DROP TABLE tpcds.table1; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 功能描述 RELEASE SAVEPOINT语句用于删除一个当前事务先前定义的保存点。 把一个保存点删除就令其无法作为回滚点使用,除此之外它没有其它用户可见的行为。它并不能撤销在保存点建立起来之后执行的命令的影响,要撤销那些命令可以使用ROLLBACK TO SAVEPOINT 。当不再需要的时候,删除一个保存点可以令系统在事务结束之前提前回收一些资源。 RELEASE SAVEPOINT也删除所有在指定的保存点建立之后的所有保存点。