小编Erw*_*ter的帖子

如何从 PostgreSQL 中的 JSON[] 数组中删除已知元素?

我遇到了在 PostgreSQL 中使用 JSON 数据类型的问题。我尝试实现在数据库中存储非规范化的 Java 模型。该模型具有复杂对象列表。因此,我决定将它们建模为原生 PostgreSQL 数组中的 JSON。

这是我的表创建语句的精简片段:

CREATE TABLE test.persons
(
  id UUID,
  firstName TEXT,
  lastName TEXT,
  communicationData JSON[],
  CONSTRAINT pk_person PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

如您所见,它是一个以 JSON 格式显示通信数据对象列表的人。其中一个对象可能如下所示:

{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}
Run Code Online (Sandbox Code Playgroud)

我可以使用 PostgreSQL 的 array_append 轻松地将这样的 JSON 对象附加到数组中。但是,我无法从数组中删除已知值。考虑一下这个 SQL 语句:

UPDATE test.persons
SET communicationData = array_remove(
      communicationData, 
      '{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}'::JSON
    )
WHERE id = 'f671eb6a-d603-11e3-bf6f-07ba007d953d';
Run Code Online (Sandbox Code Playgroud)

这失败了ERROR: could not identify an equality operator for type json。您是否有提示我如何从 JSON 数组中删除已知值?也可以按数组中的位置删除,因为我知道一个也......

PostgreSQL …

postgresql update array json

8
推荐指数
1
解决办法
2万
查看次数

存储数百万行非标准化数据或一些 SQL 魔法?

我的 DBA 经验只是简单的存储 + CMS 样式数据的检索 - 所以这可能是一个愚蠢的问题,我不知道!

我有一个问题,我需要查找或计算特定组大小和特定时间段内特定天数的假期价格。例如:

1 月任何时候 2 人 4 晚的酒店房间多少钱?

例如,我有 5000 家酒店的定价和可用性数据,如下所示:

Hotel ID | Date | Spaces | Price PP
-----------------------------------
     123 | Jan1 | 5      | 100
     123 | Jan2 | 7      | 100
     123 | Jan3 | 5      | 100
     123 | Jan4 | 3      | 100
     123 | Jan5 | 5      | 100
     123 | Jan6 | 7      | 110
     456 | Jan1 | 5      | 120
     456 | Jan2 …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions datetime denormalization

8
推荐指数
1
解决办法
769
查看次数

如何创建 Postgres 触发器以确保字段不可更新

我正在尝试创建一个 Postgres 触发器,以确保在设置列的值后,它无法更新(基本上使其成为只读)。到目前为止,我已经提出了以下草案触发器。

1) 首先,我在正确的轨道上吗?
2) 有回报价值NEW吗?
3) 我必须original_idNEW.?

CREATE FUNCTION check_id_change() RETURNS TRIGGER AS $$
    BEGIN
        IF OLD.original_id <> NEW.original_id THEN
            RAISE EXCEPTION 'cannot change original_id'; 
        END IF;
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER client_update_trigger AFTER UPDATE ON client FOR EACH ROW
      EXECUTE PROCEDURE check_id_change();
Run Code Online (Sandbox Code Playgroud)

postgresql trigger

8
推荐指数
2
解决办法
7241
查看次数

来自日期的函数 extract() 返回双精度值

为什么 Postgres 函数从值extract()返回?double precisiondate

我能想象的唯一原因是,有一些语言环境使用日历(那些不是公历并由 Postgres 支持),以不同的方式计算日期/时间并可能返回浮点数。

postgresql date-format functions

8
推荐指数
1
解决办法
1万
查看次数

Postgres 使用 MAX 和 groupBy 索引查询

有没有办法索引以下查询?

SELECT run_id, MAX ( frame ) , MAX ( time ) FROM run.frames_stat GROUP BY run_id;
Run Code Online (Sandbox Code Playgroud)

我尝试在frameand上创建排序(非复合)索引time,并在 上创建索引run_id,但查询规划器不使用它们。

杂项信息:

  • 不幸的是(出于我不会进入的原因)我无法更改查询
  • frames_stat表有 4200 万行
  • 表格不变(不会发生进一步的插入/删除)
  • 查询总是很慢,只是变慢了,因为这个数据集比过去大。
  • 表上没有索引
  • 我们正在使用 Postgres 9.4
  • 数据库的“work_mem”大小为 128MB(如果相关)。
  • 硬件:130GB 内存,10 核至强

架构:

CREATE TABLE run.frame_stat (
  id bigint NOT NULL,
  run_id bigint NOT NULL,
  frame bigint NOT NULL,
  heap_size bigint NOT NULL,
  "time" timestamp without time zone NOT NULL,
  CONSTRAINT frame_stat_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

解释分析:

HashAggregate  (cost=1086240.000..1086242.800 …
Run Code Online (Sandbox Code Playgroud)

postgresql index aggregate index-tuning postgresql-9.4

8
推荐指数
1
解决办法
1万
查看次数

将索引从一张表复制到另一张表

我有一系列 ETL 作业,在这些作业中我swap使用CREATE TABLE table1_swap LIKE table1. 为了使填充table1_swap更快,我不包括索引。但是,当我完成加载时,我需要将这些索引重新应用于新填充的表。这些索引是在这些 ETL 作业范围之外创建的,因此CREATE INDEX如果我不需要,我宁愿不必对调用进行硬编码。

是否可以将一组索引从一个表“转移”或“复制”到另一个表?

postgresql index dynamic-sql ddl plpgsql

8
推荐指数
2
解决办法
7050
查看次数

PostgreSQL 在查询 INSTEAD OF 触发器时使用 NEW

我无法让 INSTEAD OF 触发器正常工作,而且我想我误解了如何使用 NEW。考虑以下简化场景:

CREATE TABLE Product (
  product_id SERIAL PRIMARY KEY,
  product_name VARCHAR
);
CREATE TABLE Purchase (
  purchase_id SERIAL PRIMARY KEY,
  product_id INT REFERENCES Product,
  when_bought DATE
);

CREATE VIEW PurchaseView AS
SELECT purchase_id, product_name, when_bought
FROM Purchase LEFT JOIN Product USING (product_id);
Run Code Online (Sandbox Code Playgroud)

我希望能够创建INSTEAD OF触发器以允许我直接插入到 中PurchaseView,例如:

INSERT INTO Product(product_name) VALUES ('foo');
INSERT INTO PurchaseView(product_name, when_bought) VALUES ('foo', NOW());
Run Code Online (Sandbox Code Playgroud)

我的想法是这样的:

CREATE OR REPLACE FUNCTION insert_purchaseview_func()
  RETURNS trigger AS
$BODY$
BEGIN
  INSERT INTO Purchase(product_id, when_bought) …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger syntax plpgsql

8
推荐指数
1
解决办法
1万
查看次数

在 Postgres 中的多列中的任何一列上分组

是否可以在 Postgres 中创建某种分组链?假设我有以下图表:

CREATE TABLE foo AS
SELECT row_number() OVER () AS id, *
FROM ( VALUES
  ( 'X', 'D', 'G', 'P' ),
  ( 'F', 'D', 'L', 'M' ),
  ( 'X', 'N', 'R', 'S' ),
  ( 'Y', 'I', 'W', NULL ),
  ( 'U', 'Z', 'E', NULL )
) AS f(a,b,c,d);

id | a | b | c | d
------------------
 1 | X | D | G | P
 2 | F | D | L | M
 3 | …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate postgresql-9.5

8
推荐指数
2
解决办法
3768
查看次数

在 PostgreSQL 8.3 上备份并在 PostgreSQL 9.4 中还原后,数据库大小减少

pg_dump在 PostgreSQL 8.3 服务器中托管的 JIRA 数据库上做了一个。数据库后的尺寸vacuum full217132652(大约207 MB)。

然后我使用以下命令在 PostgreSQL 9.4 服务器上恢复了 JIRA 数据库:

$ psql -X -v ON_ERROR_STOP=1 -d jira2 -U jira -h localhost < jiradb2017_03_12.sql
Run Code Online (Sandbox Code Playgroud)

我假设自从我使用 以来,任何错误都会退出恢复ON_ERROR_STOP=1,但 SQL 脚本正确完成(尽管有一些与数据恢复无关的警告)。

我最终得到了一个大小为158019348(大约 151 MB)的数据库。

那么,这里有什么故事呢?我是否可以假设数据库已成功恢复并且 PostgreSQL 优化了其存储(介于 8.3 和 9.4 版本之间)引擎并且更有效地使用了空间?

postgresql disk-space restore

8
推荐指数
1
解决办法
1192
查看次数

SELECT DISTINCT ON,按另一列排序

请考虑下表test

CREATE TABLE test(col1 int, col2 varchar, col3 date);
INSERT INTO test VALUES
  (1,'abc','2015-09-10')
, (1,'abc','2015-09-11')
, (2,'xyz','2015-09-12')
, (2,'xyz','2015-09-13')
, (3,'tcs','2015-01-15')
, (3,'tcs','2015-01-18');
Run Code Online (Sandbox Code Playgroud)
postgres=# select * from test;
  col1 | col2 |    col3    
 ------+------+------------
     1 | abc  | 2015-09-10
     1 | abc  | 2015-09-11
     2 | xyz  | 2015-09-12
     2 | xyz  | 2015-09-13
     3 | tcs  | 2015-01-15
     3 | tcs  | 2015-01-18
Run Code Online (Sandbox Code Playgroud)

我想要一个按日期 desc 排序的返回集合:

 col1 | col2 |    col3    
------+------+------------
    2 | xyz  | …
Run Code Online (Sandbox Code Playgroud)

postgresql order-by greatest-n-per-group distinct postgresql-9.6

8
推荐指数
2
解决办法
3867
查看次数