• 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']]  --类型不匹配

    [postgres@localhost ~]$ 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 items@>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']]  --类型不匹配

    [postgres@localhost ~]$ 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的。
  • 相关阅读:
    laravel 5.5 仓库模式 文件之间接口与实现操作
    php 无线分类 根据子级找父级
    php 无限极分类,根据父级 找子级
    laravel5.4 中 dd和dump的区别。
    laravel hash密码生成和密码验证
    oracle建表详细信息
    关于组件的认识
    java的Thread Dump诊断工具
    weblogic连接池
    详解Oracle数据字典
  • 原文地址:https://www.cnblogs.com/YYRise/p/6268912.html
Copyright © 2020-2023  润新知