华为云用户手册

  • 修改一个序列 ALTER SEQUENCE命令更改现有序列的属性,包括修改拥有者、归属列和最大值。 指定序列与列的归属关系。 将序列和一个表的指定字段进行关联。在删除那个字段或其所在表的时候会自动删除已关联的序列。 1 ALTER SEQUENCE seq1 OWNED BY T2.id; 将序列serial的最大值修改为300: 1 ALTER SEQUENCE seq1 MAXVALUE 300;
  • 注意事项 新序列值的产生是靠GTM维护的,默认情况下,每申请一个序列值都要向GTM发送一次申请,GTM在当前值的基础上加上步长值作为产生的新值返回给调用者。GTM作为全局唯一的节点,势必成为性能的瓶颈,所以对于需要大量频繁产生序列号的操作,如使用Bulkload(批量快速导入数据)功能进行数据导入场景,是非常不推荐产生默认序列值的。比如,在下面所示的场景中, INSERT FROM SELECT语句的性能会非常慢。 1 2 3 4 5 6 7 CREATE SEQUENCE newSeq1; CREATE TABLE newT1 ( id int not null default nextval('newSeq1'), name text ); INSERT INTO newT1(name) SELECT name from T1; 可以提高性能的写法是(假设T1表导入newT1表中的数据为10000行): 1 2 INSERT INTO newT1(id, name) SELECT id,name from T1; SELECT SETVAL('newSeq1',10000); 序列操作函数nextval(),setval() 等均不支持回滚。另外setval设置的新值,会对当前会话的nextval立即生效,但对其他会话,如果定义了cache,不会立即生效,在用尽所有缓存的值后,其变动才被其他会话感知。所以为了避免产生重复值,要谨慎使用setval,设置的新值不能是已经产生的值或者在缓存中的值。 如果必须要在bulkload场景下产生默认序列值,则一定要为newSeq1定义足够大的cache,并且不要定义Maxvalue或者Minvalue。数据库会试图将nextval('sequence_name')的调用下推到Data Node,以提高性能。 目前GTM对并发的连接请求是有限制的,当Data Node很多时,将产生大量并发连接, 这时一定要控制bulkload的并发数目,避免耗尽GTM的连接资源。如果目标表为复制表(DISTRIBUTE BY REPLICATION)时下推将不能进行。当数据量较大时,这对数据库将是个灾难。除了性能问题之外,空间也可能会剧烈膨胀,在导入结束后,需要用vacuum full来恢复。最好的方式还是如上建议的,不要在bulkload的场景中产生默认序列值。 另外,序列创建后,在每个节点上都维护了一张单行表,存储序列的定义及当前值,但此当前值并非GTM上的当前值,只是保存本节点与GTM交互后的状态。如果其他节点也向GTM申请了新值,或者调用了Setval修改了序列的状态,不会刷新本节点的单行表,但因每次申请序列值是向GTM申请,所以对序列正确性没有影响。
  • 示例 将tpcds.ship_mode中的数据拷贝到/home/omm/ds_ship_mode.dat文件中: 1 COPY tpcds.ship_mode TO '/home/omm/ds_ship_mode.dat'; 将tpcds.ship_mode 输出到stdout: 1 COPY tpcds.ship_mode TO stdout; 创建tpcds.ship_mode_t1表: 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE tpcds.ship_mode_t1 ( SM_SHIP_MODE_SK INTEGER NOT NULL, SM_SHIP_MODE_ID CHAR(16) NOT NULL, SM_TYPE CHAR(30) , SM_CODE CHAR(10) , SM_CARRIER CHAR(20) , SM_CONTRACT CHAR(20) ) WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE) DISTRIBUTE BY HASH(SM_SHIP_MODE_SK ); 从stdin拷贝数据到表tpcds.ship_mode_t1: 1 COPY tpcds.ship_mode_t1 FROM stdin; 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1: 1 COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat'; 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为TEXT(format 'text'),分隔符为'\t'(delimiter E'\t'),忽略多余列(ignore_extra_data 'true'),不指定转义(noescaping 'true'): 1 COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' WITH(format 'text', delimiter E'\t', ignore_extra_data 'true', noescaping 'true'); 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header): 1 COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' FIXED FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)) header ignore_extra_data; 从/home/omm/ds_ship_mode.dat文件拷贝数据到表tpcds.ship_mode_t1,使用参数如下:导入格式为FIXED(FIXED),指定定长格式(FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))),忽略多余列(ignore_extra_data),有数据头(header),保留末尾 \t 字符: COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' (FORMAT 'fixed', FORMATTER (SM_SHIP_MODE_SK(0,2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)), PRESERVE_BLANKS‘true', HEADER 'true', IGNORE_EXTRA_DATA 'true'); 将tpcds.ship_mode_t1导出为OBS的 '/bucket/path/'路径上的TEXT格式文件ds_ship_mode.dat。需要指定包含OBS访问信息的“server”option参数: 1 COPY tpcds.ship_mode_t1 TO '/bucket/path/ds_ship_mode.dat' WITH (format 'text', encoding 'utf8', server 'obs_server'); 将tpcds.ship_mode_t1导出为OBS的 '/bucket/path/'路径上的 CS V格式文件。需要指定包含OBS访问信息的“server”option参数。其中文件包含标题行,包含BOM头,单文件最大行数1000行(超出1000行生成新的文件),自定义文件名前缀为“justprefix”: 1 COPY (select * from tpcds.ship_mode_t1 where SM_SHIP_MODE_SK=1060) TO '/bucket/path/' WITH (format 'csv', header 'on', encoding 'utf8', server 'obs_server', bom 'on', maxrow '1000', fileprefix 'justprefix'); 删除tpcds.ship_mode_t1: 1 DROP TABLE tpcds.ship_mode_t1;
  • 语法格式 从一个文件拷贝数据到一个表: 1 2 3 4 5 6 7 8 9 10 COPY table_name [ ( column_name [, ...] ) ] FROM { 'filename' | STDIN } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ LOG ERRORS ] [ LOG ERRORS data ] [ REJECT LIMIT 'limit' ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ ( option [, ...] ) | copy_option [ ...] ] 可以任意排列组合。 把一个表的数据拷贝到一个文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 COPY table_name [ ( column_name [, ...] ) ] TO { 'filename' | STDOUT } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; COPY query TO { 'filename' | STDOUT } [ WITHOUT ESCAPING ] [ [ WITH ] ( option [, ...] ) ] | copy_option | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [ ...] ] ]; COPY TO语法形式约束如下: (query)与[USING] DELIMITER不兼容,即若COPY TO的数据来自于一个query的查询结果,那么COPY TO语法不能再指定[USING] DELIMITERS语法子句。 对于FIXED FORMATTTER语法后面跟随的copy_option是以空格进行分隔的。 copy_option是指COPY原生的参数形式,而option是兼容外表导入的参数形式。 语法中的FIXED FORMATTER ( { column_name( offset, length ) } [, ...] )以及 [ ( option [, ...] ) | copy_option [ ...] ] 可以任意排列组合。 其中可选参数option子句语法为: 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 FORMAT 'format_name' | OIDS [ boolean ] | DELIMITER 'delimiter_character' | NULL 'null_string' | HEADER [ boolean ] | FILEHEADER 'header_file_string' | FREEZE [ boolean ] | QUOTE 'quote_character' | ESCAPE 'escape_character' | EOL 'newline_character' | NOESCAPING [ boolean ] | FORCE_QUOTE { ( column_name [, ...] ) | * } | FORCE_NOT_NULL ( column_name [, ...] ) | ENCODING 'encoding_name' | IGNORE_EXTRA_DATA [ boolean ] | FILL_MISSING_FIELDS [ boolean ] | COMPATIBLE_ILLEGAL_CHARS [ boolean ] | PRESERVE_BLANKS [ boolean ] | DATE_FORMAT 'date_format_string' | TIME_FORMAT 'time_format_string' | TIMESTAMP_FORMAT 'timestamp_format_string' | SMALLDATETIME_FORMAT 'smalldatetime_format_string' | SERVER 'obs_server_string' | BOM [ boolean ] | MAXROW [ integer ] | FILEPREFIX 'file_prefix_string' 其中可选参数copy_option子句语法为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 OIDS | NULL 'null_string' | HEADER | FILEHEADER 'header_file_string' | FREEZE | FORCE_NOT_NULL column_name [, ...] | FORCE_QUOTE { column_name [, ...] | * } | BINARY | CSV | QUOTE [ AS ] 'quote_character' | ESCAPE [ AS ] 'escape_character' | EOL 'newline_character' | ENCODING 'encoding_name' | IGNORE_EXTRA_DATA | FILL_MISSING_FIELDS | COMPATIBLE_ILLEGAL_CHARS | PRESERVE_BLANKS | DATE_FORMAT 'date_format_string' | TIME_FORMAT 'time_format_string' | TIMESTAMP_FORMAT 'timestamp_format_string' | SMALLDATETIME_FORMAT 'smalldatetime_format_string'
  • 注意事项 以安全模式(云上安全模式不支持关闭)启动CN、DN的开关,那么当前模式下禁止使用COPY FROM FILENAME或COPY TO FILENAME语法,可采用\copy的方式进行规避,请参考如何使用\copy导入导出中的示例。 COPY只能用于表,不能用于视图。 对任何要插入数据的表必须有插入权限。 如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。如果表中有任何不在字段列表里的字段,COPY FROM将为这些字段插入缺省值。 如果声明了数据源文件,服务器必须可以访问该文件;如果指定了STDIN,数据将在客户前端和服务器之间流动,输入时,表的列与列之间使用TAB键分隔,在新的一行中以反斜杠和句点(\.)表示输入结束。 如果数据文件的任意行包含比预期多或者少的字段,COPY FROM将抛出一个错误。 数据的结束可以用一个只包含反斜杠和句点(\.)的行表示。如果从文件中读取数据,数据结束的标记是不必要的;如果在客户端应用之间拷贝数据,必须要有结束标记。 COPY FROM中\N为空字符串,如果要输入实际数据值\N ,使用\\N。
  • 参数说明 name 待修改的订阅的名称。 取值范围:字符串,符合标识符命名规范。 CONNECTION 'conninfo' 该子句修改最初由CREATE SUBSCRIPTION设置的连接属性。 详细的参数说明参考conninfo参数说明。 publication_name 新发布的名称。 取值范围:字符串,符合标识符命名规范。 ENABLE 启用先前禁用的订阅,在事务结束时启动逻辑复制工作。 DISABLE 禁用正在运行的订阅,在事务结束时停止逻辑复制工作。 SET ( publication_parameter [= value] [, ... ] ) 该子句修改最初由CREATE PUBLICATION设置的发布参数。详细的参数说明请参考CREATE SUBSCRIPTION的参数说明。 new_owner 订阅新所有者的用户名称。 new_name 订阅的新名称。
  • 语法格式 更新订阅的连接信息。 1 ALTER SUBSCRIPTION name CONNECTION 'conninfo' 更新订阅的发布端的发布名称。 1 ALTER SUBSCRIPTION name SET PUBLICATION publication_name [, ...] 激活订阅。 1 ALTER SUBSCRIPTION name ENABLE 禁用订阅。 1 ALTER SUBSCRIPTION name DISABLE 设置订阅的参数。 1 ALTER SUBSCRIPTION name SET ( subscription_parameter [= value] [, ... ] ) 更改订阅的所有者。 1 ALTER SUBSCRIPTION name OWNER TO new_owner
  • unix_timestamp([timestamp with time zone]) 描述:获取从'1970-01-01 00:00:00'UTC到入参时间经历的秒数。无入参时,指定为当前时间。 返回值类型:bigint(无入参)/numeric(有入参) 示例: 1 2 3 4 5 SELECT unix_timestamp(); unix_timestamp ---------------- 1693906219 (1 row) 1 2 3 4 5 SELECT unix_timestamp('2018-09-08 12:11:13+06'); unix_timestamp ---------------- 1536387073.000000 (1 row)
  • statement_timestamp() 描述:当前日期及时间。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 SELECT statement_timestamp(); statement_timestamp ------------------------------- 2017-09-01 17:04:39.119267+08 (1 row)
  • numtodsinterval(num, interval_unit) 描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。 可以通过设置参数IntervalStyle为oracle,兼容该函数在Oracle中的interval输出格式。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT numtodsinterval(100, 'HOUR'); numtodsinterval ----------------- 100:00:00 (1 row) SET intervalstyle = oracle; SET SELECT numtodsinterval(100, 'HOUR'); numtodsinterval ------------------------------- +000000004 04:00:00.000000000 (1 row)
  • timeofday() 描述:当前日期及时间(像clock_timestamp,但是返回时为text。) 返回值类型:text 示例: 1 2 3 4 5 SELECT timeofday(); timeofday ------------------------------------- Fri Sep 01 17:05:01.167506 2017 CST (1 row)
  • transaction_timestamp() 描述:当前日期及时间,与current_timestamp等效。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2017-09-01 17:05:13.534454+08 (1 row)
  • from_unixtime(unix_timestamp[,format]) 描述:格式串缺省时,将unix时间戳转换为日期时间类型输出。格式串指定时,将unix时间戳转换为指定格式的字符串输出。 返回值类型:timestamp(格式串缺省)/ text(格式串指定) 示例: 1 2 3 4 5 6 7 8 9 10 SELECT from_unixtime(875996580); from_unixtime --------------------- 1997-10-04 20:23:00 (1 row) SELECT from_unixtime(875996580, '%Y %D %M %h:%i:%s'); from_unixtime --------------------------- 1997 4th October 08:23:00 (1 row)
  • add_months(d,n) 描述:用于计算时间点d再加上n个月的时间。 返回值类型:timestamp 示例: 1 2 3 4 5 SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM dual; add_months --------------------- 2018-04-29 00:00:00 (1 row)
  • last_day(d) 描述:用于计算时间点d本月最后一天的时间。 ORA和TD兼容模式下,返回值类型为timestamp。 MySQL兼容模式下,返回值类型为date。 示例: 1 2 3 4 5 select last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result; cal_result --------------------- 2017-01-31 00:00:00 (1 row)
  • next_day(x,y) 描述:用于计算x时间开始的下一个星期y的时间。 ORA和TD兼容模式下,返回值类型为timestamp。 MySQL兼容模式下,返回值类型为date。 示例: 1 2 3 4 5 select next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result; cal_result --------------------- 2017-05-28 00:00:00 (1 row)
  • isfinite(date) 描述:测试是否为有限日期。 返回值类型:boolean 示例: 1 2 3 4 5 6 7 8 9 10 SELECT isfinite(date '2001-02-16'); isfinite ---------- t (1 row) SELECT isfinite(date 'infinity'); isfinite ---------- f (1 row)
  • isfinite(timestamp) 描述:测试判断是否为有限时间。 返回值类型:boolean 示例: 1 2 3 4 5 6 7 8 9 10 SELECT isfinite(timestamp '2001-02-16 21:28:30'); isfinite ---------- t (1 row) SELECT isfinite(timestamp 'infinity'); isfinite ---------- f (1 row)
  • date_trunc(text, timestamp) 描述:截取到参数text指定的精度。 返回值类型:timestamp 示例: 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 SELECT date_trunc('hour', timestamp '2001-02-16 20:38:40'); date_trunc --------------------- 2001-02-16 20:00:00 (1 row) --获取去年的最后一天 SELECT date_trunc('day', date_trunc('year',CURRENT_DATE)+ '-1'); date_trunc ------------------------ 2022-12-31 00:00:00+00 (1 row) --获取今年的第一天 SELECT date_trunc('year',CURRENT_DATE); date_trunc ------------------------ 2023-01-01 00:00:00+00 (1 row) --获取去年的第一天 SELECT date_trunc('year',now() + '-1 year'); date_trunc ------------------------ 2022-01-01 00:00:00+00 (1 row)
  • extract(field from interval) 描述:获取field指定精度的值。如果大于12,则取与12的模。field的有效值参见EXTRACT。 返回值类型:double precision 示例: 1 2 3 4 5 SELECT extract(month from interval '2 years 3 months'); date_part ----------- 3 (1 row)
  • justify_interval(interval) 描述:结合justify_days和justify_hours,调整interval。 返回值类型:interval 示例: 1 2 3 4 5 SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR'); justify_interval ------------------ 29 days 23:00:00 (1 row)
  • maketime(hour, minute, second) 描述:根据所给的小时,分钟和秒数返回time类型的值。由于 GaussDB (DWS)中的time类型的取值范围为00:00:00到24:00:00, 故不支持hour大于24时和hour小于0时的场景。 返回值类型:time 示例: 1 2 3 4 5 select maketime(12, 15, 30.12); maketime ------------- 12:15:30.12 (1 row)
  • now([fsp]) 描述:当前事务开始的日期及时间,参数确定微秒输出精度,缺省时为6。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 SELECT now(); now ------------------------------- 2017-09-01 17:03:42.549426+08 (1 row) 1 2 3 4 5 SELECT now(3); now ---------------------------- 2021-09-08 10:59:00.427+08 (1 row)
  • trunc(timestamp) 描述:默认按天截取。 返回值类型:timestamp 示例: 1 2 3 4 SELECT trunc(timestamp '2001-02-16 20:38:40'); trunc --------------------- 2001-02-16 00:00:00 (1 row)
  • extract(field from timestamp) 描述:获取field指定精度的值。field的有效值参见EXTRACT。 返回值类型:double precision 示例: 1 2 3 4 5 SELECT extract(hour from timestamp '2001-02-16 20:38:40'); date_part ----------- 20 (1 row)
  • convert_tz(timestamp, from_tz, to_tz) 描述:将时间日期值timestamp 从from_tz (text)给出的时区转到to_tz(text)给出的时区,返回转换后的时区时间。该函数仅8.2.0及以上集群版本支持。 返回值类型:timestamp without time zone 示例: 1 2 3 4 5 6 7 8 9 10 SELECT convert_tz('2018-12-25 13:25:00', '+02:00', '+08:00'); convert_tz -------------------- 2018-12-25 19:25:00 (1 row) SELECT convert_tz('2000-02-28 23:00:00', 'GMT', 'MET'); convert_tz -------------------- 2000-02-29 00:00:00 (1 row)
  • timestampdiff(field, timestamp1, timestamp2) 描述:将两个日期参数相减(timestamp2 - timestamp1),并以单位field作为返回值。若相减值为负,则函数返回值为负。field支持的参数为year、month、quarter、day、week、hour、minute、second和microsecond。 返回值类型:bigint 示例: 1 2 3 4 5 SELECT timestampdiff(day, timestamp '2001-02-01', timestamp '2003-05-01 12:05:55'); timestampdiff --------------- 819 (1 row)
  • timediff(timestamp | time | text, timestamp | time | text) 描述:将两个日期参数相减。若相减值为负,则函数返回值为负。两个入参类型要求一致。该函数仅8.2.0及以上集群版本支持。 返回值类型:time 示例: 1 2 3 4 5 SELECT timediff('2022-7-5 1:1:1', '2021-7-5 1:1:1'); timediff --------------- 8760:00:00 (1 row)
  • curtime([fsp]) 描述:当前时间。fsp为选填参数,参数类型为整型,表示指定返回的小数秒精度。该函数仅8.2.0及以上集群版本支持。 返回值类型:time with time zone 示例: 1 2 3 4 5 6 7 8 9 10 SELECT curtime(); timetz -------------------- 16:58:07.086215+08 (1 row) SELECT curtime(2); timetz -------------------- 16:58:07.08+08 (1 row)
  • subtime(timestamp | time | text, interval | text) 描述:返回给定日期/时间减去指定时间间隔的结果。该函数仅8.2.0及以上集群版本支持。 返回值类型:与第一个入参类型相同。 示例: 1 2 3 4 5 select subtime('2020-11-13 01:01:01', '23:59:59'); addtime --------------------- 2020-11-12 01:01:02 (1 row)
共100000条