全文索引
tsvector tsvector[] tsquery tsquery[]
日期
1.inverval的输入格式如下:
[@] quantity unit [quantity unit...] [direction] 或者 P [ years-months-days ] [ T hours:minutes:seconds ]
其中@标记是可选的,quantity是一个数字。
unit可以是microsecond,millisecond,second, minute,hour,day,week, month,year,decade,century,millennium或这些单位的缩写或复数。
direction可以是ago或为空。
第一种格式例如:'1 day 12 hours 59 min 10 sec' 或者省略单位'1-3 3 4:05:06' 。第二种格式如:P0001-02-03T04:05:06 或者P1Y2M3DT4H5M6S。
2.关于abstime:
abstime和reltime类型是低分辨率类型, 它们被用于系统内部。我们反对你使用这些类型, 因为这些旧类型的部分或全部可能会在未来的版本里消失。
具体格式类似 timestamp [ (p) ] with time zone
名字 | 存储空间 | 输出格式 | 描述 | 最低值 | 最高值 | 精度 |
---|---|---|---|---|---|---|
timestamp [ (p) ] [ without time zone ] | 8字节 | 2003-04-12 04:05:06.123457 |
日期和时间(无时区) | 4713 BC | 294276 AD | 1微秒/14位 |
timestamp [ (p) ] with time zone | 8字节 | 2003-04-12 16:05:06.123457+08 | 日期和时间,带时区 | 4713 BC | 294276 AD | 1微秒/14位 |
date | 4字节 | 1999-01-08 00:00:00 | 只用于日期 | 4713 BC | 5874897 AD | 1天 |
time [ (p) ] [ without time zone ] | 8字节 | 04:05:06.123457 | 只用于时间 | 00:00:00 | 24:00:00 | 1微秒/14位 |
time [ (p) ] with time zone | 12字节 | 04:05:06.123457-04 | 时间带时 区末位四舍五入 |
00:00:00+1459 | 24:00:00-1459 | 1微秒/14位 |
interval [ fields ] [ (p) ] | 12字节 | 2 years 3 mons 1 day 12:59:10 | 时间间隔 | -178000000年 | 178000000年 | 1微秒/14位 |
abstime | 2003-04-12 16:05:06+08 | 日期和时间带时区 |
几何类型
名字 | 存储空间 | 说明 | 表现形式 |
---|---|---|---|
point | 16字节 | 平面中的点 | (x,y) |
line | 32字节 | (无穷)直线(未完全实现) | ((x1,y1),(x2,y2)) |
lseg | 32字节 | (有限)线段 | ((x1,y1),(x2,y2)) |
box | 32字节 | 矩形 | ((x1,y1),(x2,y2)) |
path | 16+16n字节 | 闭合路径(与多边形类似 | ((x1,y1),...) |
path | 16+16n字节 | 开放路径 | [(x1,y1),...] |
polygon | 40+16n字节 | 多边形(与闭合路径相似) | ((x1,y1),...) |
circle | 24字节 | 圆 | <(x,y),r> (圆心和半径) |
网络地址
inet类型:
该类型的输入格式是address/y, 这里的address是IPv4或者IPv6地址, y是子网掩码的二进制位数。 如果/y部分未填, 则子网掩码对IPv4而言是32,对IPv6而言是128。
所以该值表示只有一台主机。显示时,如果该值表示只有一台主机, /y将不会显示。 示例:'::10.2.3.4/4'或者'192.168.1.100'或者'::10.2.3.4'
名字 | 存储空间 | s | 描述 |
---|---|---|---|
cidr | 7或19字节 | IPv4或IPv6网络 | |
inet | 7或19字节 | IPv4 或 IPv6 网络和主机 | |
macaddr | 6字节 | MAC 地址 |
uuid
1.如果字段指定了该类型,不填写的话默认不会自动生成uuid,需要填写uuid格式的字符串。
2.UUID被写成一个小写十六进制数字的序列,由分字符分成几组,特别是一组8位数字+3组4位数字+一组12位数字,总共32个数字代表128位。
3.PostgreSQL同样支持以其他方式输入:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
uuid uuid[]
对象标识符
我的理解就是按照系统表的一套转化规则获取某张系统表的oid,举两个例子应该就能明白了。
SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;
查看pg_class的表结构,发现表结构里面有个类型为name字段名称为relname的一个字段。
--> 'mytable'::regclass 就相当于SELECT oid FROM pg_class WHERE relname = 'mytable'
下面这个这个例子规则就会复杂些了。
select 'sum(int4)'::regprocedure 同样查看pg_proc的表结构select * from pg_proc 发现里面有个类型为name的proname字段
但是这次不同了,这个proname里面没有sum(int4)只有sum,参数类型应该是在这张表里面别的字段控制的。
所以说它内部有一套规则,这些类型我们使用::还是相当方便的。
名字 | 引用 | 描述 | 数值例子 |
---|---|---|---|
oid | 任意 | 数字化的对象标识符 | 564182 |
regproc | pg_proc | 函数名字 | sum |
regprocedure | pg_proc | 带参数类型的函数 | sum(int4) |
regoper | pg_operator | 操作符名 | + |
regoperator | pg_operator | 带参数类型的操作符 | *(integer,integer) or -(NONE,integer) |
regclass | pg_class | 关系名 | pg_type |
regtype | pg_type | 数据类型名 | integer |
regconfig | pg_ts_config | 全文检索配置 | english |
regdictionary | pg_ts_dict | 全文检索路径 | simple |
输入格式如下:
update table_objsymbol set "regproc" = 'lastval'::regproc
update table_objsymbol set "regdictionary" = 'simple'::regdictionary
update table_objsymbol set "txid_snapshot" = '10:20:10'
update table_objsymbol set "tid" = '(3,4)'
xid xid[] (事务(缩写xact)标识符)
cid cid[] (命令标识符)
tid tid[] (行标识符)
oidvector oidvector[]
txid_snapshot txid_snapshot[]
范围类型
范围类型是相当有用的,它表示一个集合,postgre里面提供了很多函数和操作符来使用这个集合, 如下面的几种操作,但是有一点需要注意的范围的集合是左闭右开的。
-- 值是否在该范围内
SELECT int4range(10, 20) @> 15;
-- 判断是否有交集
SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);
-- 找出区间的上边界值
SELECT upper(int8range(15, 25));
-- 计算集合的交集
SELECT int4range(10, 20) * int4range(15, 25);
-- 判断是否为空集
SELECT isempty(numrange(1, 5));
范围的格式如下:
(lower-bound,upper-bound)
(lower-bound,upper-bound]
[lower-bound,upper-bound)
[lower-bound,upper-bound]
empty
范围类型有下面几种:
-
int4range — Range of integer
-
int8range — Range of bigint
-
numrange — Range of numeric
-
tsrange — Range of timestamp without time zone
-
tstzrange — Range of timestamp with time zone
-
daterange — Range of date
其它类型 先列出来,有些还没有找到使用方法。
-- pg_lsn pg_lsn[]
-- aclitem 权限控制,输入格式为'user1=r'。user1为自己定义的用户,后面的权限'arwdDxtXUCTc'只能是其中一种。
-- 查询某字段类型在系统表或者用户表中是否存在
select oid,typname from pg_type where typname = 'pg_node_tree';
select attrelid::regclass,attname,atttypid from pg_attribute where atttypid=194
--pg_node_tree insert --ERROR: cannot accept a value of type pg_node_tree
select "typdefaultbin" from "pg_type" where "typdefaultbin" is not null
--regoper,refcursor,tinterval smgr 系统表中不存在该字段
cstring[] pseudo-type 伪列,用户不能使用该列。
gtsvector gtsvector_in not implemented 尚未实现该类型。