标签: postgresql

在多个查询中使用相同的 Postgres WITH

我想WITH在多个查询中使用相同的。

WITH x AS (INSERT ... RETURNING id)
INSERT INTO t2 VALUES (x);
INSERT INTO t3 VALUES (x);
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我是否必须创建一个临时表?

postgresql

6
推荐指数
1
解决办法
8136
查看次数

如何验证 postgres 9.3 db 没有损坏?

我有一个在 ubuntu 服务器上运行的 postgres 9.3 db。
大约一个月前,我们的 VPS 托管公司解决了服务器上的硬件问题。

问题很快得到解决,一切似乎都运行良好。
我们使用另一台服务器上的酒保运行备份 - 备份和恢复工作正常(我检查过)。

数据损坏的第一个迹象是几天前:我决定在我们的数据库上做一个完整的 pg_dump,就像我每隔一段时间做的那样,它失败了(块中的页头无效......) - 数据似乎已经很久以前就损坏了 - 大约在硬件问题发生的时候(那是损坏记录上的日期)。我求助于查找损坏的记录,然后将其删除并手动恢复。

在那之后,我能够做一个完整的 pg_dump。

为了检查其他损坏 - 我从备份中设置了不同的数据库服务器并对所有表运行 pg_repack 以验证我能够重建所有索引和表。

我的问题是:
1. 我如何确定我的数据库中没有任何额外的损坏?

2. 如何定期检查我的数据完整性?
3. 除了转储整个数据库并重新索引它(我已经这样做了)之外,我还能做些什么来验证我们数据库的完整性?

PS - 我没有启用块校验和。

postgresql corruption data-integrity postgresql-9.3

6
推荐指数
1
解决办法
6749
查看次数

PostgreSQL - 设计数据库以避免频繁更新大型数据集

我们正在尝试使用这些数字和查询要求来优化数据库的性能:

  1. 200-400k 网段由唯一ID标识
  2. 每个网段都有一个状态,其动态属性数量有限(即平均速度)。动态属性的单个状态可以存储在 8 个字节中
  3. 段状态每 3 分钟改变一次,H24,7/7
  4. 是否可以查询特定日期范围内的一组段(有时是所有段)的状态或仅查询实际情况。
  5. 可以请求空间查询以查找特定日期(通常是“现在”)“我周围”的所有段

有了这些必要条件,我们就得出了这个解决方案(有一个很大的缺点,解释如下)。

[A] TABLE main_segments_history( 
      id_segment integer NOT NULL,
      day date NOT NULL,    
      day_slices bigint[],
      CONSTRAINT main_segments_history_pk PRIMARY KEY (id_segment,day)
)

[B] TABLE current_segment_release_state(
      id_segment integer NOT NULL,
      release_date timestamptz,
      ... all other attributes ...
      CONSTRAINT currsegm_release_state_pk PRIMARY KEY (id_segment,release_date)
)
Run Code Online (Sandbox Code Playgroud)

解释[A]表:

  1. 它在字段“day”上使用 partition_manager ( pg_partman)进行分区。每个分区是一个月
  2. day_slices 数组是一个 480 个元素的一维数组,表示全天每个 3 分钟切片的粒度

解释[B]表:

  1. 它只是每个段的当前发布状态

有一个后端进程详细说明了网络。
它每 3 分钟插入或更新每个段的状态。
换句话说,此过程将在一天开始时插入新行,并将每 3 分钟更新一次内部数组。

该解决方案的优点 …

postgresql performance database-design

6
推荐指数
1
解决办法
1287
查看次数

不能在准备好的语句中插入多个命令

当我在 PG 管理查询工具中尝试时,此查询对我有用:

UPDATE bankdetails SET bank_details = 'mysore' ,"PAN"= 123,bank_acc = 456,
                       "UAN"=789,tax = 'myy'
WHERE  user_id = 79;
INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax)
       SELECT 79,'mysore',123,456,789,'myy'
       WHERE NOT EXISTS (SELECT 1 FROM bankdetails WHERE user_id=79);
Run Code Online (Sandbox Code Playgroud)

后来我在我的代码中是这样实现的:

db.query('UPDATE bankdetails SET bank_details = $2 ,"PAN"= $3,bank_acc = $4,"UAN"=$5,tax = $6 WHERE user_id = $1; INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax) SELECT $1,$2,$3,$4,$5,$6 WHERE NOT EXISTS (SELECT 1 FROM bankdetails WHERE user_id = $1);', [companyuser.rows[0]._id, data.bankDetails.bank_details, data.bankDetails.PAN, data.bankDetails.bank_acc, data.bankDetails.UAN, data.bankDetails.tax],function(err,bank) {

                if (err) return callback(new …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.6

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

PostgreSQL:如何将多字串缩短为几个字?

我正在使用 PostgreSQL 9.5.6。我有空格分隔的多字串,我需要缩短说 3 个字?

我查看了文档,为了使用 substring() 函数,我需要知道要开始提取的字符的索引位置,但我正在使用的字符串长度不同。

我也看过 split_part() 并且只返回一个词。

我怎样才能得到类似的东西:

hello everyone out there somewhere
Run Code Online (Sandbox Code Playgroud)

缩短为

hello everyone out
Run Code Online (Sandbox Code Playgroud)

postgresql array string

6
推荐指数
1
解决办法
2311
查看次数

使用 Postgres 将值累积到数组中

目前我有这个查询:

select 
    sum(case when my_table.property_type = 'FLAT' then my_table.price else 0 end) as Flat_Current_Asking_Price,
    sum(case when my_table.property_type_mapped = 'SEMIDETACHED' then my_table.price else 0 end) as Semidetached_Current_Asking_Price
from 
    my_table;
Run Code Online (Sandbox Code Playgroud)

所以如果my_table有以下值:

property_type | price
--------------+-------
FLAT          | 5000
SEMIDETACHED  | 9000
FLAT          | 6000
Run Code Online (Sandbox Code Playgroud)

查询将返回:

Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
11000                     | 9000
Run Code Online (Sandbox Code Playgroud)

如何替换将sum值累积到数组中以获取?

Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
{5000, 6000}              | {9000}
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate array aggregate-filter

6
推荐指数
1
解决办法
4625
查看次数

在 Postgres 10 中将 ICU 排序规则指定为 `ENCODING`、`LC_COLLATE` 和 `LC_CTYPE`

Postgres 10 获得了使用国际组件进行 Unicode (ICU)排序的能力,而不是依赖于主机操作系统的实现。请参阅Peter Eisentraut在 PostgreSQL 10 中使用 ICU 支持的更强大的排序规则。

那么在创建数据库时究竟如何指定 ICU 排序规则呢?

我确实在CREATE DATABASEto use 中阅读了一个提示,template0而不是template1iftemplate1可能是使用编码和整理而不是您想要的新数据库创建的。并且在使用时template0,您需要启用数据连接以覆盖默认值。

我在 Postgres 10 doc page for Collat​​ion Support中读到:

und-x-icu(用于“未定义”)

ICU“根”整理。使用它来获得合理的与语言无关的排序顺序。

因此,und-x-icu在建立包含多语言文本的新数据库时,这似乎是一个很好的使用价值。当已知某种语言专注于特定语言时,该SELECT命令可以指定另一种排序规则,例如 German de-x-icu。否则,回退到默认值und-x-icu

所以我尝试了以下 SQL 在 Postgres 10 Beta 2 中创建一个数据库。

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu'
LC_CTYPE 'und-x-icu'
;
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

[42809] …

postgresql collation postgresql-10 international-components-unicode

6
推荐指数
1
解决办法
2556
查看次数

使用 Postgres 在数组上映射函数

Postgres 中是否有任何方法可以将函数应用于数组(或任何类型的集合)的结果?

例如,如果我有一个create function add1...将数字加一的函数,有什么办法可以做到:

select map add1 array[1,5,8...];
Run Code Online (Sandbox Code Playgroud)

回来

array [2,6,9...]
Run Code Online (Sandbox Code Playgroud)

?

我不确定它是否对 a 有任何意义,select因为它可以直接将函数映射到单个结果上:

select add1(x) from X;
Run Code Online (Sandbox Code Playgroud)

另外,这里有懒惰的概念吗?所有功能都将“严格”应用?

postgresql

6
推荐指数
1
解决办法
5883
查看次数

PostgreSQL 9.5.2 DELETE 永远占用

我有一个看似简单的删除:

DELETE FROM table WHERE added_at < '2017-08-14'
Run Code Online (Sandbox Code Playgroud)

在具有 ~20k 行(w ~10k 受影响行)的表上,但它已经运行了 2000+ 秒。

SELECT * FROM table WHERE added_at < '2017-08-14'
Run Code Online (Sandbox Code Playgroud)

需要几毫秒。

我还有其他一些带有FOREIGN KEYs 的表,id并且我有一些以前的记录指向它,但是它们已经被删除了。

我试图:

postgresql delete

6
推荐指数
1
解决办法
3823
查看次数

意外的 PostgreSQL 重启

我的 PostgreSQL 服务器意外重启并显示以下消息:

2017-08-16 03:44:34 GMT LOG:  received fast shutdown request
2017-08-16 03:44:34 GMT LOG:  aborting any active transactions
2017-08-16 03:44:34 GMT FATAL:  terminating connection due to administrator command
2017-08-16 03:44:34 GMT FATAL:  terminating connection due to administrator command
2017-08-16 03:44:34 GMT LOG:  autovacuum launcher shutting down
2017-08-16 03:44:34 GMT LOG:  shutting down
2017-08-16 03:44:34 GMT LOG:  database system is shut down
2017-08-16 03:46:04 GMT LOG:  incomplete startup packet
2017-08-16 03:46:04 GMT LOG:  database system was shut down at 2017-08-16 …
Run Code Online (Sandbox Code Playgroud)

postgresql pg-hba.conf

6
推荐指数
2
解决办法
8251
查看次数