PostgreSQL 9.5.1官方文档学习笔记(2)

一些函数:array_dims,以文本形式返回数组的所有维度;array_length,指定维度的数组长度;array_upper,返回指定维度上界;array_lower,返回指定维度下界;cardinality,所有维度的元素个数总和(不知能否用于子数组或子维度)。

对于一维数组,set arraycol[m] = xxoo,若m大于当前长度,那么arraycol将自动扩充到m上界,而原上界到新上界之间位置的项将置为null,重复一遍,目前只有一维数组有这个特性。

array_prepend、array_append、array_cat用于元素的头尾插入或数组的连接,前两者只能用于一维数组,一般我们可以使用连接符 || 来提供这三者的功能。

数组检索相关:any、all、generate_subscripts、array_position、array_positions、&&(左操作数是否包含右操作数)。关于数组检索,官方文档有这么段提示:数组不是集合,搜索数组中的特定元素通常表明你的数据库设计有问题。 数组字段通常是可以分裂成独立的表(with a row for each item of the array)。 很明显表要容易搜索得多,并且在元素数目非常庞大的时候也可以更好地伸展。这似乎表示数组是设计用来进行直接展示的,若业务查询需要关联数组中的特定值,则需要考虑重新设计或使用其它类型。

插:在使用MySql的时候,我们通常会被告知,使用有最大长度的char或者varchar会在性能方面有好处,而在PostgreSQL中,却不一定是这样。在PostgreSQL中,这三种类型的字符串数据并没有明显的性能差别,而且character(n)类型的数据一般是最慢的,因为固定长度导致更多的存储空间。所以,一般来说,text或者character varying就行了。

Functions

PostgreSQL没有存储过程的概念(博主也不明白为何其它数据库要划分存储过程和函数)。函数会返回最后一条语句的结果[的第一行数据];若要返回结果集,需要显示声明要返回某类型的结果集或Table。 Unless the function is declared to return void, the last statement must be a SELECT, or an INSERT, UPDATE, or DELETE that has a RETURNING clause. You cannot use transaction control commands, e.g. COMMIT, SAVEPOINT, and some utility commands, e.g. VACUUM, in SQL functions. 函数体以双"$"符号或单引号包裹,若用单引号包裹则需要注意特殊字符转义。可以在函数体内以参数名(9.2及以后版本支持)或"$n"的方式引用参数。举个例子:

CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS integer AS $$ UPDATE bank SET balance = balance - debit WHERE accountno = tf1.accountno -- 由于参数名和列同名,前面需要加函数名作为前缀 -- ;SELECT balance FROM bank WHERE accountno = tf1.accountno; RETURNING balance; $$ LANGUAGE SQL;

在INSERT INTO或者UPDATE的时候在最后面加上RETURNING colname,PostgreSQL会在插入或者更新数据之后会返回你指定的字段。

函数可以接收、返回多个字段,将这多个字段看作一个整体,称为复合类型。比如数据表中的一行,或者使用ROW构造函数构造的一行数据,或者以逗号分隔的多个字段。我们可以显式定义自己的复合类型,如:

CREATE TYPE inventory_item AS ( name text, supplier_id integer, price numeric );

然后就可以将inventory_item用于很多地方了,甚至将一个表字段类型设置为inventory_item,如下:

CREATE TABLE on_hand ( item inventory_item, count integer ); INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ab224977c56bd0c18e126d829b19e16b.html