PostgreSQL数组使用

原文:https://my.oschina.net/Kenyon/blog/133974

1.数组的定义 
 不一样的维度元素长度定义在数据库中的实际存储都是一样的,数组元素的长度和类型必须要保持一致,并且以中括号来表示。 
合理的: 
array[1,2]            --一维数组 
array[[1,2],[3,5]]  --二维数组 
‘{99,889}‘

不合理的: 
array[[1,2],[3]]                     --元素长度不一致 
array[[1,2],[‘Kenyon‘,‘good‘]]  --类型不匹配

[[email protected] ~]$ psql
psql (9.2.4)
Type "help" for help.
postgres=# create table t_kenyon(id serial primary key,items int[]);
NOTICE:  CREATE TABLE will create implicit sequence "t_kenyon_id_seq" for serial column "t_kenyon.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t_kenyon_pkey" for table "t_kenyon"
CREATE TABLE
postgres=# \d+ t_kenyon
                                              Table "public.t_kenyon"
Column |   Type    |                       Modifiers                       | Storage  | Stats target | Description
--------+-----------+-------------------------------------------------------+----------+--------------+-------------
id     | integer   | not null default nextval(‘t_kenyon_id_seq‘::regclass) | plain    |              |
items  | integer[] |                                                       | extended |              |
Indexes:
    "t_kenyon_pkey" PRIMARY KEY, btree (id)
Has OIDs: no

postgres=# create table t_ken(id serial primary key,items int[4]);
NOTICE:  CREATE TABLE will create implicit sequence "t_ken_id_seq" for serial column "t_ken.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t_ken_pkey" for table "t_ken"
CREATE TABLE

postgres=# \d+ t_ken
                                              Table "public.t_ken"
 Column |   Type    |                     Modifiers                      | Storage  | Stats target | Description
--------+-----------+----------------------------------------------------+----------+--------------+-------------
 id     | integer   | not null default nextval(‘t_ken_id_seq‘::regclass) | plain    |              |
 items  | integer[] |                                                    | extended |              |
Indexes:
    "t_ken_pkey" PRIMARY KEY, btree (id)
Has OIDs: no

数组的存储方式是extended的。

2.数组操作

a.数据插入(两种方式)

postgres=# insert into t_kenyon(items) values(‘{1,2}‘);
INSERT 0 1
postgres=# insert into t_kenyon(items) values(‘{3,4,5}‘);
INSERT 0 1
postgres=# insert into t_kenyon(items) values(array[6,7,8,9]);
INSERT 0 1
postgres=# select * from t_kenyon;
id |   items
----+-----------
  1 | {1,2}
  2 | {3,4,5}
  3 | {6,7,8,9}
(3 rows)

b.数据删除

postgres=# delete from t_kenyon where id = 3;
DELETE 1
postgres=# delete from t_kenyon where items[1] = 4;
DELETE 0
postgres=# delete from t_kenyon where items[1] = 3;
DELETE 1

c.数据更新

往后追加
postgres=# update t_kenyon set items = items||7;
UPDATE 1
postgres=# select * from t_kenyon;
id |  items
----+---------
  1 | {1,2,7}
(1 row)

postgres=# update t_kenyon set items = items||‘{99,66}‘;
UPDATE 1
postgres=# select * from t_kenyon;
id |      items
----+------------------
  1 | {1,2,7,55,99,66}
(1 row)

往前插
postgres=# update t_kenyon set items = array_prepend(55,items) ;
UPDATE 1
postgres=# select * from t_kenyon;
id |        items
----+---------------------
  1 | {55,1,2,7,55,99,66}
(1 row)

d.数据查询

postgres=# insert into t_kenyon(items) values(‘{3,4,5}‘);
INSERT 0 1

postgres=# select * from t_kenyon where id = 1;
id |        items
----+---------------------
  1 | {55,1,2,7,55,99,66}
(1 row)

postgres=# select * from t_kenyon where items[1] = 55;
id |        items
----+---------------------
  1 | {55,1,2,7,55,99,66}
(1 row)

postgres=# select * from t_kenyon where items[3] = 5;
id |  items
----+---------
  4 | {3,4,5}
(1 row)

postgres=# select items[1],items[3],items[4] from t_kenyon;
items | items | items
-------+-------+-------
    55 |     2 |     7
     3 |     5 |
(2 rows)

postgres=# select unnest(items) from t_kenyon where id = 4;
unnest
--------
      3
      4
      5
(3 rows)

e.数组比较

postgres=# select ARRAY[1,2,3] <= ARRAY[1,2,3];
?column?
----------
t
(1 row)

f.数组字段类型转换

postgres=# select array[[‘11‘,‘12‘],[‘23‘,‘34‘]]::int[];
       array
-------------------
{{11,12},{23,34}}
(1 row)

postgres=# select array[[11,12],[23,34]]::text[];
       array
-------------------
{{11,12},{23,34}}
(1 row)

3.数组索引

postgres=# create table t_kenyon(id int,items int[]);
CREATE TABLE
postgres=# insert into t_kenyon values(1,‘{1,2,3}‘);
INSERT 0 1
postgres=# insert into t_kenyon values(1,‘{2,4}‘);
INSERT 0 1
postgres=# insert into t_kenyon values(1,‘{34,7,8}‘);
INSERT 0 1
postgres=# insert into t_kenyon values(1,‘{99,12}‘);
INSERT 0 1
postgres=# create index idx_t_kenyon on t_kenyon using gin(items);
CREATE INDEX
postgres=# set enable_seqscan = off;
postgres=# explain select * from t_kenyon where [email protected]>array[2];
                                QUERY PLAN
---------------------------------------------------------------------------
 Bitmap Heap Scan on t_kenyon  (cost=8.00..12.01 rows=1 width=36)
   Recheck Cond: (items @> ‘{2}‘::integer[])
   ->  Bitmap Index Scan on idx_t_kenyon  (cost=0.00..8.00 rows=1 width=0)
         Index Cond: (items @> ‘{2}‘::integer[])
(4 rows)

1.数组的定义 
 不一样的维度元素长度定义在数据库中的实际存储都是一样的,数组元素的长度和类型必须要保持一致,并且以中括号来表示。 
合理的: 
array[1,2]            --一维数组 
array[[1,2],[3,5]]  --二维数组 
‘{99,889}‘

不合理的: 
array[[1,2],[3]]                     --元素长度不一致 
 array[[1,2],[‘Kenyon‘,‘good‘]]  --类型不匹配

[[email protected] ~]$ psql
psql (9.2.4)
Type "help" for help.
postgres=# create table t_kenyon(id serial primary key,items int[]);
NOTICE:  CREATE TABLE will create implicit sequence "t_kenyon_id_seq" for serial column "t_kenyon.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t_kenyon_pkey" for table "t_kenyon"
CREATE TABLE
postgres=# \d+ t_kenyon
                                              Table "public.t_kenyon"
Column |   Type    |                       Modifiers                       | Storage  | Stats target | Description
--------+-----------+-------------------------------------------------------+----------+--------------+-------------
id     | integer   | not null default nextval(‘t_kenyon_id_seq‘::regclass) | plain    |              |
items  | integer[] |                                                       | extended |              |
Indexes:
    "t_kenyon_pkey" PRIMARY KEY, btree (id)
Has OIDs: no

postgres=# create table t_ken(id serial primary key,items int[4]);
NOTICE:  CREATE TABLE will create implicit sequence "t_ken_id_seq" for serial column "t_ken.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t_ken_pkey" for table "t_ken"
CREATE TABLE

postgres=# \d+ t_ken
                                              Table "public.t_ken"
 Column |   Type    |                     Modifiers                      | Storage  | Stats target | Description 
--------+-----------+----------------------------------------------------+----------+--------------+-------------
 id     | integer   | not null default nextval(‘t_ken_id_seq‘::regclass) | plain    |              | 
 items  | integer[] |                                                    | extended |              | 
Indexes:
    "t_ken_pkey" PRIMARY KEY, btree (id)
Has OIDs: no

数组的存储方式是extended的。
时间: 2024-10-02 04:06:16

PostgreSQL数组使用的相关文章

postgresql 数组类型初步实践

实践环境 数据库:postgresql 9.4:操作系统:windows 创建包含数组类型的数据库 注意在设置default 值时(当然你可以不指定默认值),要声明数组的类型,像这样声明"::bigint[]". create table testarray( id serial primary key, images bigint[] default array[]::bigint[] ); 插入数组值 注意插入数组时,也要声明数组的类型,同上 insert into testarr

正确使用PostgreSQL的数组类型

2014-03-03 10:10 佚名 开源中国编译 我要评论(0) 字号:T | T 在Heap中,我们依靠PostgreSQL支撑大多数后端繁重的任务,我们存储每个事件为一个hstore blob,我们为每个跟踪的用户维护一个已完成事件的PostgreSQL数组,并将这些事件按时间排序. AD:2014WOT全球软件技术峰会北京站 课程视频发布 在Heap中,我们依靠PostgreSQL支撑大多数后端繁重的任务,我们存储每个事件为一个hstore blob,我们为每个跟踪的用户维护一个已完成

go postgresql array

将postgresql数组字段的初始值定为空串时报错,应设置为'{}' pq: 有缺陷的数组常量:"" 若数组字段rows.Scan用interface{}输入,会乱码,但如果字段可为null,scan又会报错 最后将表里面的字段设为not null,然后go读出的string为image=="{... , ... , ...}" strings.Split(image[1:len(image)-1],",")

Mybatis调用PostgreSQL存储过程实现数组入参传递

注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 1 如上所示,参数是一个int数组,Mybatis提

postgresql (PG) &nbsp; 数组函数和操作符

操作符 描述 例子 结果 = 等于 ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] t <> 不等于 ARRAY[1,2,3] <> ARRAY[1,2,4] t < 小于 ARRAY[1,2,3] < ARRAY[1,2,4] t > 大于 ARRAY[1,4,3] > ARRAY[1,2,4] t <= 小于等于 ARRAY[1,2,3] <= ARRAY[1,2,3] t >= 大于等于 ARRAY[

Postgresql Jsonb字段内含数组属性的删除元素操作

1.创建示例表 create temp table settings as select '{"west": [ {"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1}, {"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3} ]}'::

PostgreSQL系列一:PostgreSQL简介与安装

一.PostgreSQL简介 1.1 PostgreSQL概述 PostgreSQL数据库是目前功能最强大的开源数据库,支持丰富的数据类型(如JSON和JSONB类型.数组类型)和自定义类型.而且它提供了丰富的接口,可以很容易地扩展它的功能,如可以在GiST框架下实现自己的索引类型等,它还支持使用C语言写自定义函数.触发器,也支持使用流行的语言写自定义函数,比如其中的PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python.PL/Tcl,等等. 1.2 PostgreS

PostgreSQL安装及简单使用

一.PostgreSQL简介 1.什么是PostgreSQL PostgreSQL数据库是目前功能最强大的开源数据库,支持丰富的数据类型(如JSON何JSONB类型,数组类型)和自定义类型.而且它提供了丰富的接口,可以很容易地扩展它的功能,如可以在GiST框架下实现自己的索引类型等,它还支持使用C语言写自定义函数.触发器,也支持使用流行的语言写自定义函数,比如其中的PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python.PL/Tcl,等等. 2.PostgreSQL数

PostgreSQL即学即用(第2版)pdf

下载地址: 网盘下载 内容简介 · · · · · · 本书将帮助你理解和使用PostgreSQL 这一开源数据库系统.你不仅会学到版本9.2.9.3 和9.4中的企业级特性,还会发现PostgreSQL 不只是个数据库系统,也是一个出色的应用平台.本书通过示例展示了如何实现在其他数据库中难以或无法完成的任务.这一版内容覆盖了LATERAL 查询.增强的JSON 支持.物化视图和其他关键话题. 作者简介  · · · · · · Regina Obe 是数据库咨询公司Paragon的负责人之一,