华为云用户手册

  • NOT IN expression NOT IN (value [, ...]) 右侧括号中的是一个表达式列表。左侧表达式的结果与表达式列表的内容进行比较。如果在列表中的内容没有符合左侧表达式结果的内容,则NOT IN的结果为true。如果有符合的内容,则NOT IN的结果为false。 示例如下: 12345 SELECT 8000+500 NOT IN (10000, 9000) AS RESULT; result ---------- t(1 row) 如果查询语句返回结果为空,或者表达式列表不符合表达式的条件且右侧表达式列表返回结果至少一处为空,则NOT IN的返回结果为null,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。 提示:在所有情况下X NOT IN Y等价于NOT(X IN Y)。
  • 示例 character存储类型转换。对一个目标列定义为character(20)的语句,下面的语句显示存储值的长度正确: 1 2 3 4 5 6 7 8 9101112131415161718 CREATE TABLE x1( customer_sk integer, customer_id char(20), first_name char(6), last_name char(8))with (orientation = column,compression=middle)distribute by hash (last_name);INSERT INTO x1(customer_sk, customer_id, first_name) VALUES (3769, 'abcdef', 'Grace');SELECT customer_id, octet_length(customer_id) FROM x1; customer_id | octet_length ----------------------+-------------- abcdef | 20(1 row)DROP TABLE x1; 这里真正发生的事情是两个unknown文本缺省解析成text,这样就允许||操作符解析成text连接。然后操作符的text结果转换成bpchar("空白填充的字符型", character类型内部名称)以匹配目标字段类型。不过,从text到bpchar的转换是二进制兼容的,这样的转换是隐含的并且实际上不做任何函数调用。最后,在系统表里找到长度转换函数bpchar(bpchar, integer, boolean) 并且应用于该操作符的结果和存储的字段长。这个类型相关的函数执行所需的长度检查和额外的空白填充。
  • 值存储数据类型解析 查找与目标字段准确的匹配。 试着将表达式直接转换成目标类型。如果已知这两种类型之间存在一个已登记的转换函数,那么直接调用该转换函数即可。如果表达式是一个未知类型文本,该文本字符串的内容将交给目标类型的输入转换过程。 检查目标类型是否有长度转换。长度转换是一个从某类型到自身的转换。如果在pg_cast表里面找到一个,那么在存储到目标字段之前先在表达式上应用。这样的转换函数总是接受一个额外的类型为integer的参数,它接收目标字段的atttypmod值(实际上是其声明长度,atttypmod的解释随不同的数据类型而不同),并且它可能接受一个boolean类型的第三个参数,表示转换是显式的还是隐式的。转换函数负责施加那些长度相关的语义,比如长度检查或者截断。
  • 事务控制语法 启动事务 GaussDB (DWS)通过START TRANSACTION和BEGIN语法启动事务,请参考START TRANSACTION和BEGIN。 设置事务 GaussDB(DWS)通过SET TRANSACTION或者SET LOCAL TRANSACTION语法设置事务,请参考SET TRANSACTION。 提交事务 GaussDB(DWS)通过COMMIT或者END可完成提交事务的功能,即提交事务的所有操作,请参考COMMIT | END。 回滚事务 回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。请参考ROLLBACK。 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,如果其中有一个语句失败,那么整个请求都将会被回滚。 其他事务操作 SAVEPOINT用于在当前事务里建立一个新的保存点。即在一个事务中标记一个位置并且允许做部分回滚。用户可以回滚在一个保存点之后执行的命令但保留该保存点之前执行的命令。请参考SAVEPOINT。 ROLLBACK TO SAVEPOINT回滚事务到一个保存点。隐含地删除所有在该保存点之后建立的保存点。请参考ROLLBACK TO SAVEPOINT。 RELEASE SAVEPOINT删除一个事务内的保存点。请参考RELEASE SAVEPOINT。
  • 两阶段事务 GaussDB(DWS)属于分布式share-nothing架构,表的数据分布在不同的节点上。客户端的一条或多条语句可能会同时修改多个节点上的数据,这种情况下,会产生分布式事务。GaussDB(DWS)采用两阶段提交事务来保证分布式事务中数据的一致性和事务的原子性。顾名思义,两阶段提交就是将事务提交划分为两个阶段,通常针对的是包含写操作的事务。当写操作将数据写入不同的节点时,需要满足事务的原子性要求,要么全部提交,要么全部回滚。 不支持两阶段的场景如下: 不支持显示的两阶段提交语法PREPARE TRANSACTION。 12 BEGIN;PREPARE TRANSACTION 'p1'; 不支持在两阶段事务中修改系统表的文件映射关系。 1 REINDEX TABLE pg_class; 不支持在跨节点的事务中提交导出事务快照。 1234 BEGIN;CREATE TABLE t1(a int);SELECT pg_export_snapshot();END;
  • 事务的属性 事务具有以下四个标准属性,通常根据首字母缩写为ACID。 Atomicity(原子性):事务中的全部操作在数据库中是不可分割的,整个事务中的所有操作要么全部完成,要么全部失败,对于一个事务来说,不能只执行其中的一部分操作。 比如: A给B转账,A扣除500元 ,B增加500元。整个事务的操作要么全部成功,要么全部失败,不能出现A扣钱,但是B不增加的情况。如果原子性不能保证,就会出现一致性问题。 Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,这包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 比如:A给B转账,A扣除500元 ,B增加500元,扣除的钱-500与增加的钱+500,相加应该为0。如从A账户转账500元到B账户,不管操作成功与否,A和B的存款总额是不变的。 Isolation(隔离性):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。 Durability(持久性):一旦事务提交,则其所做的修改就会永久保存到数据库中。即使系统故障,已经提交的修改数据也不会丢失。 表1 ACID用途 ACID 属性 用途 Atomicity 原子性 并发控制,故障恢复。 Consistency 一致性 SQL的完整性约束(主键约束、外键约束)。 Isolation 隔离性 并发控制。 Durability 持久性 故障恢复。 常用的并发控制技术有基于锁的并发控制和基于时间戳的并发控制,GaussDB(DWS)数据库针对DDL语句采用两阶段锁技术,而针对DML语句则采用多版本控制技术(Multi-Version Concurrency Control,MVCC)。GaussDB(DWS)数据库的故障恢复采用WAL日志的方式来实现,目前主要支持Redo日志,通过Redo日志和MVCC可以保证事务读写的一致性。
  • 隔离级别 Isolation(隔离性)可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离级别,决定多个事务并发操作同一个对象时的处理方式。 GaussDB(DWS)的事务隔离级别,由GUC参数transaction_isolation或SET TRANSACTION语法设置,支持以下隔离级别,默认为读已提交(read committed)。 read committed:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。 read uncommitted:读未提交隔离级别,GaussDB(DWS)不支持read uncommitted,如果设置了read uncommitted,实际上使用的是read committed。 repeatable read:可重复读隔离级别,仅仅能看到事务开始之前提交的数据,不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 serializable:事务可序列化,GaussDB(DWS)不支持serializable,如果设置了serializable,实际上使用的是repeatable read。
  • 事务场景示例 某顾客在商店使用电子支付购买100元的物品,当中至少包括两个操作:1. 该顾客的账户减少100元。2. 商店账户(商户)增加100元。支持事务的数据库管理系统就是要确保以上两个操作(整个“事务”)都能完成,或一起取消。 创建样例数据: 创建一个简单的用户金额表并向表中插入数据(假设商户和顾客的账户上各有500元)。 12345 CREATE TABLE customer_info (NAME VARCHAR(32) PRIMARY KEY,MONEY INTEGER);INSERT INTO customer_info (name, money) VALUES ('buyer', 500), ('shop', 500); 查看表数据显示商户和顾客各有500元。 1 SELECT * FROM customer_info; 普通操作(正常模式)。 模拟正常购买过程,顾客先扣款100元,商户再增加款额100元。 1234 UPDATE customer_info SET money = money-100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'buyer');UPDATE customer_info SET money = money+100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'shop');SELECT * FROM customer_info; 恢复初始值。 12 UPDATE customer_info SET money=500;select * from customer_info; 普通操作(异常模式)。 模拟购买过程出现状况,顾客发生扣款100元,商户没有增加款额。 顾客先扣款100元。 1 UPDATE customer_info SET money = money-100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'buyer'); 商户发现支付有问题,终止了后续交易。商户增加款操作直接报错,终止执行下面的语句。(仅商户觉得支付有问题) 1 UPDATE customer_info SET money = money+100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'shop'); 查询结果发现:消费者已经扣款,但商户没增加款额,这里顾客的金额了100元。 1 SELECT * FROM customer_info; 因此,如果没有事务,一旦SQL语句中间出现异常,整个账户系统的收支就不平衡了。 使用数据库事务,模拟出现异常操作时,进行事务回滚。 恢复初始值: 1 UPDATE customer_info SET money=500; 开启事务后,顾客先扣款100元。 12 BEGIN TRANSACTION;UPDATE customer_info SET money = money-100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'buyer'); 商户增加款额操作直接报错,终止执行下面的语句。 1 UPDATE customer_info SET money = money+100 WHERE name IN (SELECT name FROM customer_info WHERE name = 'shop'); 回滚事务,在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销。 12 END TRANSACTION;ROLLBACK 查询显示顾客和商户的账户金额仍旧完整一致。即数据库在事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,数据库的完整性没有被破坏。 1 SELECT * FROM customer_info;
  • 操作步骤 创建一个文本搜索配置ts_conf,复制预定义的文本搜索配置english。 12 CREATE TEXT SEARCH CONFIGURATION ts_conf ( COPY = pg_catalog.english );CREATE TEXT SEARCH CONFIGURATION 创建Synonym词典。 假设同义词词典定义文件pg_dict.syn内容如下: 123 postgres pg pgsql pg postgresql pg 执行如下语句创建Synonym词典: 12345 CREATE TEXT SEARCH DICTIONARY pg_dict ( TEMPLATE = synonym, SYNONYMS = pg_dict, FILEPATH = 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1' ); 创建一个Ispell词典english_ispell(词典定义文件来自开源词典)。 1234567 CREATE TEXT SEARCH DICTIONARY english_ispell ( TEMPLATE = ispell, DictFile = english, AffFile = english, StopWords = english, FILEPATH = 'obs://bucket01/obs.example.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1'); 设置文本搜索配置ts_conf,修改某些类型的token对应的词典列表。关于token类型的详细信息,请参见解析器。 1234 ALTER TEXT SEARCH CONFIGURATION ts_conf ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part WITH pg_dict, english_ispell, english_stem; 在文本搜索配置中,选择设置不索引或搜索某些token类型。 12 ALTER TEXT SEARCH CONFIGURATION ts_conf DROP MAPPING FOR email, url, url_path, sfloat, float; 使用文本检索调测函数ts_debug()对所创建的词典配置ts_conf进行测试。 12345 SELECT * FROM ts_debug('ts_conf', 'PostgreSQL, the highly scalable, SQL compliant, open source object-relationaldatabase management system, is now undergoing beta testing of the nextversion of our software.'); 可以设置当前session使用ts_conf作为默认的文本搜索配置。此设置仅在当前session有效。 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627 \dF+ ts_conf Text search configuration "public.ts_conf"Parser: "pg_catalog.default" Token | Dictionaries -----------------+------------------------------------- asciihword | pg_dict,english_ispell,english_stem asciiword | pg_dict,english_ispell,english_stem file | simple host | simple hword | pg_dict,english_ispell,english_stem hword_asciipart | pg_dict,english_ispell,english_stem hword_numpart | simple hword_part | pg_dict,english_ispell,english_stem int | simple numhword | simple numword | simple uint | simple version | simple word | pg_dict,english_ispell,english_stemSET default_text_search_config = 'public.ts_conf';SETSHOW default_text_search_config; default_text_search_config ---------------------------- public.ts_conf(1 row)
  • 文档概念 文档是全文搜索系统的搜索单元,例如:杂志上的一篇文章或电子邮件消息。文本搜索引擎必须能够解析文档,而且可以存储父文档的关联词素(关键词)。后续,这些关联词素用来搜索包含查询词的文档。 在GaussDB(DWS)中,文档通常是一个数据库表中一行的文本字段,或者这些字段的可能组合(级联)。文档可能存储在多个表中或者需动态获取。换句话说,一个文档由被索引化的不同部分构成,因此无法存储为一个整体。比如: 1 2 3 4 5 6 7 8 91011 SELECT d_dow || '-' || d_dom || '-' || d_fy_week_seq AS identify_serials FROM tpcds.date_dim WHERE d_fy_week_seq = 1;identify_serials ------------------ 5-6-1 0-8-1 2-3-1 3-4-1 4-5-1 1-2-1 6-7-1(7 rows) 实际上,在这些示例查询中,应该使用coalesce防止一个独立的NULL属性导致整个文档的NULL结果。 另外一种可能是:文档在文件系统中作为简单的文本文件存储。在这种情况下,数据库可以用于存储全文索引并且执行搜索,同时可以使用一些唯一标识从文件系统中检索文档。然而,从数据库外部检索文件需要拥有系统管理员权限或者特殊函数支持。因此,还是将所有数据保存在数据库中比较方便。同时,将所有数据保存在数据库中可以方便地访问文档元数据以便于索引和显示。 为了实现文本搜索目的,必须将每个文档减少至预处理后的tsvector格式。搜索和相关性排序都是在tsvector形式的文档上执行的。原始文档只有在被选中要呈现给用户时才会被当检索。因此,常将tsvector说成文档,但是很显然其实它只是完整文档的一种紧凑表示。 父主题: 介绍
  • 处理tsvector GaussDB(DWS)提供了用来操作tsvector类型的函数和操作符。 tsvector || tsvector tsvector连接操作符返回一个新的tsvector类型,它综合了两个tsvector中词素和位置信息,并保留词素的位置信息和权重标签。右侧的tsvector的起始位置位于左侧tsvector的最后位置,因此,新生成的tsvector几乎等同于将两个原始文档字串连接后进行to_tsvector操作。(这个等价是不准确的,因为任何从左边tsvector中删除的停用词都不会影响结果,但是,在使用文本连接时,则会影响词素在右侧tsvector中的位置。) 相较于对文本进行连接后再执行to_tsvector操作,使用tsvector类型进行连接操作的优势在于,可以对文档的不同部分使用不同配置进行解析。因为setweight函数会对给定的tsvector中的语素进行统一设置,如果想要对文档的不同部分设置不同的权重,需要在连接之前对文本进行解析和权重设置。 setweight(vector tsvector, weight "char") returns tsvector setweight返回一个输入tsvector的副本,其中每一个位置都使用给定的权重做了标记。权值可以为A、B、C或D(D是tsvector副本的默认权重,并且不在输出中呈现)。当对tsvector进行连接操作时,这些权重标签将会被保留,文档不同部分以不同的权重进行排序。 权重标签作用于位置,而不是词素。如果传入的tsvector已经被剥离了位置信息,那么setweight函数将什么都不做。 length(vector tsvector) returns integer 返回vector中的词素的数量。 strip(vector tsvector) returns tsvector 返回一个tsvector类型,其中包含输入的tsvector的同义词,但不包含任何位置和权重信息。虽然在相关性排序中,这里返回的tsvector要比未拆分的tsvector的作用小很多,但它通常都比未拆分的tsvector小的多。 父主题: 附加功能
  • Snowball词典 Snowball词典模板支持词干分析词典,基于Martin Porter的Snowball项目,内置有许多语言的词干分析算法。GaussDB(DWS)中预定义有多种语言的Snowball词典,可通过系统表PG_TS_DICT查看预定义的词干分析词典以及支持的语言词干分析算法。 无论是否可以简化,Snowball词典将标识所有输入为已识别,因此它应当被放置在词典列表的最后。把Snowball词典放在任何其他词典前面会导致后继词典失效,因为输入token不会通过Snowball词典进入到下一个词典。 关于Snowball词典的语法,请参见CREATE TEXT SEARCH DICTIONARY。 父主题: 词典
  • 背景信息 在SQL语言中,每个数据都与一个决定其行为和用法的数据类型相关。GaussDB(DWS)提供一个可扩展的数据类型系统,该系统比其它SQL实现更具通用性和灵活性。因而,GaussDB(DWS)中大多数类型转换是由通用规则来管理的,这种做法允许使用混合类型的表达式。 GaussDB(DWS)扫描/分析器只将词法元素分解成五个基本种类:整数、浮点数、字符串、标识符和关键字。大多数非数字类型首先表现为字符串。SQL语言的定义允许将常量字符串声明为具体的类型。例,下面查询: 12345 SELECT text 'Origin' AS "label", point '(0,0)' AS "value"; label | value--------+------- Origin | (0,0)(1 row) 示例中有两个文本常量,类型分别为text和point。如果没有为字符串文本声明类型,则该文本首先被定义成一个unknown类型。 在GaussDB(DWS)分析器里,有四种基本的SQL结构需要独立的类型转换规则: 函数调用 多数SQL类型系统是建筑在一套丰富的函数上的。函数调用可以有一个或多个参数。因为SQL允许函数重载,所以不能通过函数名直接找到要调用的函数,分析器必须根据函数提供的参数类型选择正确的函数。 操作符 SQL允许在表达式上使用前缀或后缀(单目)操作符,也允许表达式内部使用双目操作符(两个参数)。像函数一样,操作符也可以被重载,因此操作符的选择也和函数一样取决于参数类型。 值存储 INSERT和UPDATE语句将表达式结果存入表中。语句中的表达式类型必须和目标字段的类型一致或者可以转换为一致。 UNION,CASE和相关构造 因为联合SELECT语句中的所有查询结果必须在一列里显示出来,所以每个SELECT子句中的元素类型必须相互匹配并转换成一个统一类型。类似地,一个CASE构造的结果表达式必须转换成统一的类型,这样整个case表达式会有一个统一的输出类型。同样的要求也存在于ARRAY构造以及GREATEST和LEAST函数中。 系统表pg_cast存储了有关数据类型之间的转换关系以及如何执行这些转换的信息。详细信息请参见PG_CAST。 语义分析阶段会决定表达式的返回值类型并选择适当的转换行为。数据类型的基本类型分类,包括:boolean、numeric、string、bitstring、datetime、timespan、geometric和network。每种类型都有一种或多种首选类型用于解决类型选择的问题。根据首选类型和可用的隐含转换,就可能保证有歧义的表达式(那些有多个候选解析方案的)得到有效的方式解决。 所有类型转换规则都是建立在下面几个基本原则上的: 隐含转换绝不能有奇怪的或不可预见的输出。 如果一个查询不需要隐含的类型转换,分析器和执行器不应该进行更多的额外操作。这就是说,任何一个类型匹配、格式清晰的查询不应该在分析器里耗费更多的时间,也不应该向查询中引入任何不必要的隐含类型转换调用。 另外,如果一个查询在调用某个函数时需要进行隐式转换,当用户定义了一个有正确参数的函数后,解释器应该选择使用新函数。
  • TD兼容模式下,空串转换为数值类型的处理 TD数据库不同于Oracle,Oracle将空串当做NULL进行处理,TD在将空串转换为数值类型的时候,默认将空串转换为0进行处理,因此查询空串会查询到数值为0的数据。同样地,在TD兼容模式下,字符串转换数值的过程中,也会将空串默认转换为相应数值类型的0值进行处理。除此之外,' - '、' + '、' '这些字符串也都会在TD兼容模式下默认转换为0进行处理,但是小数点字符串' . '会报错。例如: 1 2 3 4 5 6 7 8 910111213 create table t1(no int,col varchar);insert into t1 values(1,'');insert into t1 values(2,null);select * from t1 where col is null; no | col----+----- 2 |(1 row)select * from t1 where col=''; no | col----+----- 1 |(1 row) MySQL兼容模式下对空串转换为数值类型的处理和TD兼容模式相同。
  • 对于CASE、COALESCE、IF和IFNULL,在TD兼容模式下的处理 如果所有输入都是相同的数据类型,不包括unknown类型,那么解析成所输入的相同数据类型。 如果所有输入都是unknown类型则解析成text类型。 如果输入字符串(包括unknown,unknown当text来处理)和数字类型,那么解析成字符串类型,如果是其他不同的类型范畴,则报错。 如果输入类型是同一个类型范畴,则选择该类型的优先级较高的类型。 把所有输入转换为所选的类型。如果从给定的输入到所选的类型没有隐式转换则失败。
  • 对于CASE、COALESCE、IF和IFNULL,在MySQL兼容模式下的处理 如果所有输入都是相同的类型,不包括unknown类型,那么解析成所输入的相同数据类型。 如果所有输入都是unknown类型则解析成text类型。 如果输入是unknown类型和某一非unknown类型,则解析成该非unknown类型。 如果存在多种非unknown类型,将enum类型当做text类型,再进行比较。 如果输入类型是同一个类型范畴,则选择该类型的优先级较高的类型。如果是不同的类型范畴,则解析成text类型。 把所有输入转换为所选的类型。如果从给定的输入到所选的类型没有隐式转换则失败。
  • UNION,CASE和相关构造解析 如果所有输入都是相同的数据类型,不包括unknown类型(即输入的字符串文本未声明类型,该文本首先被定义成一个未知类型),那么解析成所输入的相同数据类型。 如果所有输入都是unknown类型则解析成text类型(字符串类型范畴的首选类型)。否则,忽略unknown输入。 如果输入不属于同一个类型范畴,查询失败(unknown类型除外)。 如果输入类型是同一个类型范畴,则选择该类型范畴的首选类型(union操作会选择第一个分支的类型作为所选类型的情况除外)。 系统表pg_type中typcategory表示数据类型范畴, typispreferred表示是否是typcategory分类中的首选类型。 把所有输入转换为所选的类型(对于字符串保持原有长度)。如果从给定的输入到所选的类型没有隐式转换则失败。 若输入中含json、txid_snapshot、sys_refcursor或几何类型,则不能进行union。
  • 多边形 多边形由一系列点代表(多边形的顶点)。多边形可以认为与闭合路径一样,但是存储方式不一样而且有自己的一套支持函数。 用下面的语法描述polygon的数值: ( ( x1 , y1 ) , ... , ( xn , yn ) )( x1 , y1 ) , ... , ( xn , yn )( x1 , y1 , ... , xn , yn )x1 , y1 , ... , xn , yn 点表示多边形的端点。 多边形输出使用第一种语法。
  • 路径 路径由一系列连接的点组成。路径可能是开放的,也就是认为列表中第一个点和最后一个点没有连接,也可能是闭合的,这时认为第一个和最后一个点连接起来。 用下面的语法描述path的数值: [ ( x1 , y1 ) , ... , ( xn , yn ) ]( ( x1 , y1 ) , ... , ( xn , yn ) )( x1 , y1 ) , ... , ( xn , yn )( x1 , y1 , ... , xn , yn )x1 , y1 , ... , xn , yn 点表示组成路径的线段的端点。方括弧([])表明一个开放的路径,圆括弧(())表明一个闭合的路径。当最外层的括号被省略,如在第三至第五语法,会假定一个封闭的路径。 路径的输出使用第一种或第二种语法输出。
  • 任意精度型 NUMBER类型能够用于存储对于精度位数没有限制的数字,并且可以用于执行精确计算。当要求高精确度时,推荐使用这种类型来存储货币总量和其他类型的数量值。与整数类型相比,任意精度类型需要更大的存储空间,其存储效率、运算效率以及压缩比效果都要差一些。 NUMBER类型数值的范围是小数点右边部分的小数位数。NUMBER类型数值的精度是指整个数值包含的所有数字,也就是小数点左右两边的所有数字。所以,可以说数值23.1234的精度为6,范围是4。可以认为整数的范围是0。 使用Numeric/Decimal进行列定义时,建议指定该列的精度p(总位数)以及范围s(小数位数)。 如果数值的精度或者范围大于列的数据类型所声明的精度和范围,那么系统将会试图对这个值进行四舍五入。如果不能对数值进行四舍五入的处理来满足数据类型的限制,则会报错。 表2 任意精度型 名称 描述 存储空间 范围 NUMERIC[(p[,s])], DECIMAL[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 NUMBER[(p[,s])] NUMERIC类型的别名,为兼容Oracle数据类型。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有DECIMAL数值类型的表。 1 CREATE TABLE decimal_type_t1 (DT_COL1 DECIMAL(10,4)); 插入数据。 12 INSERT INTO decimal_type_t1 VALUES(123456.122331);INSERT INTO decimal_type_t1 VALUES(123456.452399); 查看数据。 123456 SELECT * FROM decimal_type_t1; dt_col1------------- 123456.1223 123456.4524(2 rows)
  • 序列整型 SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的类型,只是为在表中设置唯一标识而存在的概念。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除该序列。目前只支持在创建表时指定SERIAL列,不可以在已有的表中增加SERIAL列。另外临时表也不支持创建SERIAL列。因为SERIAL不是真正的类型,也不可以将表中存在的列类型转化为SERIAL。 表4 序列整型 名称 描述 存储空间 范围 SMALLSERIAL 二字节序列整型。 2字节 1 ~ 32,767 SERIAL 四字节序列整型。 4字节 1 ~ 2,147,483,647 BIGSERIAL 八字节序列整型。 8字节 1 ~ 9,223,372,036,854,775,807 示例: 创建带有序列类型的表。 1 CREATE TABLE smallserial_type_tab(a SMALLSERIAL); 插入数据。 1 INSERT INTO smallserial_type_tab VALUES(default); 再次插入数据。 1 INSERT INTO smallserial_type_tab VALUES(default); 查看数据。 123456 SELECT * FROM smallserial_type_tab; a --- 1 2(2 rows) 插入NULL值会报错。 12 INSERT INTO smallserial_type_tab VALUES(NULL);ERROR: dn_6001_6002: null value in column "a" violates not-null constraint
  • 整数类型 TINYINT、SMALLINT、INTEGER、BINARY_INTEGER和BIGINT类型存储整个数值(不带有小数部分),也就是整数。如果尝试存储超出范围以外的数值将会导致错误。 常用的类型是INTEGER,一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。 表1 整数类型 名称 描述 存储空间 范围 TINYINT 微整数,别名为INT1。 1字节 0 ~ 255 SMALLINT 小范围整数,别名为INT2。 2字节 -32,768 ~ +32,767 INTEGER 常用的整数,别名为INT4。 4字节 -2,147,483,648 ~ +2,147,483,647 BINARY_INTEGER 常用的整数INTEGER的别名,为兼容Oracle类型。 4字节 -2,147,483,648 ~ +2,147,483,647 BIGINT 大范围的整数,别名为INT8。 8字节 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 示例: 创建带有TINYINT、INTEGER、BIGINT类型数据的表。 1234567 CREATE TABLE int_type_t1 ( a TINYINT, b TINYINT, c INTEGER, d BIGINT); 插入数据。 1 INSERT INTO int_type_t1 VALUES(100, 10, 1000, 10000); 查看数据。 12345 SELECT * FROM int_type_t1; a | b | c | d -----+----+------+------- 100 | 10 | 1000 | 10000(1 row)
  • 浮点类型 浮点类型属于非精确,可变精度的数值类型。实际上,这些类型通常是对于二进制浮点算术(分别是单精度和双精度)的IEEE标准754的具体实现,在一定范围内由特定的处理器,操作系统和编译器所支持。 表3 浮点类型 名称 描述 存储空间 范围 REAL, FLOAT4 单精度浮点数,不精准。 4字节 6位十进制数字精度。 DOUBLE PRECISION, FLOAT8 双精度浮点数,不精准。 8字节 1E-307~1E+308, 15位十进制数字精度。 FLOAT[(p)] 浮点数,不精准。精度p取值范围为[1,53]。 说明: p为精度,表示总位数。 4字节或8字节 根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。 BINARY_DOUBLE 是DOUBLE PRECISION的别名,为兼容Oracle类型。 8字节 1E-307~1E+308, 15位十进制数字精度。 DEC[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明: p为总位数,s为小数位位数。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 INTEGER[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有浮点类型的表。 1 2 3 4 5 6 7 8 910 CREATE TABLE float_type_t2 ( FT_COL1 INTEGER, FT_COL2 FLOAT4, FT_COL3 FLOAT8, FT_COL4 FLOAT(3), FT_COL5 BINARY_DOUBLE, FT_COL6 DECIMAL(10,4), FT_COL7 INTEGER(6,3)) DISTRIBUTE BY HASH ( ft_col1); 插入数据。 1 INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654); 查看数据。 12345 SELECT * FROM float_type_t2; ft_col1 | ft_col2 | ft_col3 | ft_col4 | ft_col5 | ft_col6 | ft_col7 ---------+---------+-------------+---------+---------+----------+--------- 10 | 10.3655 | 123456.1234 | 10.3214 | 321.321 | 123.1237 | 123.124(1 row)
  • 时间段输入 reltime的输入方式可以采用任何合法的时间段文本格式,包括数字形式(含负数和小数)及时间形式,其中时间形式的输入支持SQL标准格式、ISO-8601格式、POSTGRES格式等。另外,文本输入需要加单引号。 时间段输入的详细信息请参考表6 时间段输入。 表6 时间段输入 输入示例 输出结果 描述 60 2 mons 采用数字表示时间段,默认单位是day,可以是小数或负数。特别的,负数时间段,在语义上,可以理解为“早于多久”。 31.25 1 mons 1 days 06:00:00 -365 -12 mons -5 days 1 years 1 mons 8 days 12:00:00 1 years 1 mons 8 days 12:00:00 采用POSTGRES格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。 -13 months -10 hours -1 years -25 days -04:00:00 -2 YEARS +5 MONTHS 10 DAYS -1 years -6 mons -25 days -06:00:00 P-1.1Y10M -3 mons -5 days -06:00:00 采用ISO-8601格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。 -12H -12:00:00 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122232425 --创建表。CREATE TABLE reltime_type_tab(col1 character(30), col2 reltime);--插入数据。INSERT INTO reltime_type_tab VALUES ('90', '90');INSERT INTO reltime_type_tab VALUES ('-366', '-366');INSERT INTO reltime_type_tab VALUES ('1975.25', '1975.25');INSERT INTO reltime_type_tab VALUES ('-2 YEARS +5 MONTHS 10 DAYS', '-2 YEARS +5 MONTHS 10 DAYS');INSERT INTO reltime_type_tab VALUES ('30 DAYS 12:00:00', '30 DAYS 12:00:00');INSERT INTO reltime_type_tab VALUES ('P-1.1Y10M', 'P-1.1Y10M');--查看数据。SELECT * FROM reltime_type_tab; col1 | col2 --------------------------------+------------------------------------- 1975.25 | 5 years 4 mons 29 days -2 YEARS +5 MONTHS 10 DAYS | -1 years -6 mons -25 days -06:00:00 P-1.1Y10M | -3 mons -5 days -06:00:00 -366 | -1 years -18:00:00 90 | 3 mons 30 DAYS 12:00:00 | 1 mon 12:00:00(6 rows)--删除表。DROP TABLE reltime_type_tab;
  • 日期输入 日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。 日期的文本输入需要加单引号包围,语法如下: type [ ( p ) ] 'value' 可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。表2显示了date类型的输入方式。 表2 日期输入方式 例子 描述 1999-01-08 ISO 8601格式(建议格式),任何方式下都是1999年1月8号。 January 8, 1999 在任何datestyle输入模式下都无歧义。 1/8/1999 有歧义,在MDY模式下是一月八号,在DMY模式下是八月一号。 1/18/1999 MDY模式下是一月十八日,其它模式下被拒绝。 01/02/03 MDY模式下的2003年1月2日。 DMY模式下的2003年2月1日。 YMD模式下的2001年2月3日。 1999-Jan-08 任何模式下都是1月8日。 Jan-08-1999 任何模式下都是1月8日。 08-Jan-1999 任何模式下都是1月8日。 99-Jan-08 YMD模式下是1月8日,否则错误。 08-Jan-99 一月八日,除了在YMD模式下是错误的之外。 Jan-08-99 一月八日,除了在YMD模式下是错误的之外。 19990108 ISO 8601;任何模式下都是1999年1月8日。 990108 ISO 8601;任何模式下都是1999年1月8日。 1999.008 年和年里的第几天。 J2451187 儒略日。 January 8, 99 BC 公元前99年。 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637 --创建表。CREATE TABLE date_type_tab(coll date);--插入数据。INSERT INTO date_type_tab VALUES (date '12-10-2010');--查看数据。SELECT * FROM date_type_tab; coll --------------------- 2010-12-10 00:00:00(1 row)--查看日期格式。SHOW datestyle; DateStyle ----------- ISO, MDY(1 row)--设置日期格式。SET datestyle='YMD';SET--插入数据。INSERT INTO date_type_tab VALUES(date '2010-12-11');--查看数据。SELECT * FROM date_type_tab; coll --------------------- 2010-12-10 00:00:00 2010-12-11 00:00:00(2 rows)--删除表。DROP TABLE date_type_tab;
  • 特殊值 GaussDB(DWS)支持几个特殊值,在读取的时候将被转换成普通的日期/时间值,请参考表5。 表5 特殊值 输入字符串 适用类型 描述 epoch date,timestamp 1970-01-01 00:00:00+00 (Unix系统零时) infinity timestamp 比任何其他时间戳都晚 -infinity timestamp 比任何其他时间戳都早 now date,time,timestamp 当前事务的开始时间 today date,timestamp 今日午夜 tomorrow date,timestamp 明日午夜 yesterday date,timestamp 昨日午夜 allballs time 00:00:00.00 UTC
  • 示例 显示用字母t和f输出boolean值。 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728 --创建表。CREATE TABLE bool_type_t1 ( BT_COL1 BOOLEAN, BT_COL2 TEXT) DISTRIBUTE BY HASH(BT_COL2);--插入数据。INSERT INTO bool_type_t1 VALUES (TRUE, 'sic est');INSERT INTO bool_type_t1 VALUES (FALSE, 'non est');--查看数据。SELECT * FROM bool_type_t1; bt_col1 | bt_col2 ---------+--------- t | sic est f | non est(2 rows)SELECT * FROM bool_type_t1 WHERE bt_col1 = 't'; bt_col1 | bt_col2 ---------+--------- t | sic est(1 row)--删除表。DROP TABLE bool_type_t1;
  • 二进制类型 GaussDB(DWS)支持的二进制类型请参见表1。 表1 二进制类型 名称 描述 存储空间 BLOB 二进制大对象 目前BLOB支持的外部存取接口仅为: DBMS_LOB.GETLENGTH DBMS_LOB.READ DBMS_LOB.WRITE DBMS_LOB.WRITEAPPEND DBMS_LOB.COPY DBMS_LOB.ERASE 这些接口详细说明请参见DBMS_LOB。 说明: 列存不支持BLOB类型 最大为1G-8023B(即1073733621B)。 RAW 变长的十六进制类型 说明: 列存不支持RAW类型 4字节加上实际的十六进制字符串。最大为1G-8023B(即1073733621B)。 BYTEA 变长的二进制字符串 4字节加上实际的二进制字符串。最大为1G-8023B(即1073733621B)。 除了每列的大小限制以外,每个元组的总大小也不可超过1G-8203字节。 示例 1 2 3 4 5 6 7 8 910111213141516171819202122 --创建表。CREATE TABLE blob_type_t1 ( BT_COL1 INTEGER, BT_COL2 BLOB, BT_COL3 RAW, BT_COL4 BYTEA) DISTRIBUTE BY REPLICATION;--插入数据。INSERT INTO blob_type_t1 VALUES(10,empty_blob(),HEXTORAW('DEADBEEF'),E'\\xDEADBEEF');--查询表中的数据。SELECT * FROM blob_type_t1; bt_col1 | bt_col2 | bt_col3 | bt_col4 ---------+---------+----------+------------ 10 | | DEADBEEF | \xdeadbeef(1 row)--删除表。DROP TABLE blob_type_t1; 父主题: 数据类型
  • 位串类型 位串就是一串1和0的字符串。它们可以用于存储位掩码。 GaussDB(DWS)支持两种位串类型:bit(n)和bit varying(n),其中n是一个正整数。 bit类型的数据必须准确匹配长度n,如果存储短或者长的数据都会报错。bit varying类型的数据是最长为n的变长类型,超过n的类型会被拒绝。一个没有长度的bit等效于bit(1),没有长度的bit varying表示没有长度限制。 如果显式地把一个位串值转换成bit(n),则此位串右边的内容将被截断或者在右边补齐零,直到刚好n位,而且不会抛出任何错误。类似地,如果显式地把一个位串数值转换成bit varying(n),如果它超过了n位,则它的右边将被截断。 位串类型使用示例: 创建示例表bit_type_t1: 123456 CREATE TABLE bit_type_t1 ( BT_COL1 INTEGER, BT_COL2 BIT(3), BT_COL3 BIT VARYING(5)) DISTRIBUTE BY REPLICATION; 插入数据: 1 INSERT INTO bit_type_t1 VALUES(1, B'101', B'00'); 插入数据的长度不符合类型的标准会报错。 123 INSERT INTO bit_type_t1 VALUES(2, B'10', B'101');ERROR: bit string length 2 does not match type bit(3)CONTEXT: referenced column: bt_col2 将不符合类型长度的数据进行转换: 1 INSERT INTO bit_type_t1 VALUES(2, B'10'::bit(3), B'101'); 查看数据: 123456 SELECT * FROM bit_type_t1; bt_col1 | bt_col2 | bt_col3 ---------+---------+--------- 1 | 101 | 00 2 | 100 | 101(2 rows) 父主题: 数据类型
  • UUID格式 UUID由开放软件基金会标准化,作为分布式计算环境的一部分,在互联网工程任务组(IETF)公布的RFC 4122标准中对UUID进行了标准化。标准的UUID由36个字符组成,其中包括32个16进制数字和4个连字符‘-’,形式为8-4-4-4-12,标准的UUID示例如下: 1 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 除了标准型的UUID,GaussDB(DWS)同样支持以其他方式输入:大写字母和数字、由花括号包围的标准格式、省略部分或所有连字符、在任意一组四位数字之后加一个连字符。示例: 1234 A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}a0eebc999c0b4ef8bb6d6bb9bd380a11a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全