我想WITH在多个查询中使用相同的。
WITH x AS (INSERT ... RETURNING id)
INSERT INTO t2 VALUES (x);
INSERT INTO t3 VALUES (x);
Run Code Online (Sandbox Code Playgroud)
我该怎么做?我是否必须创建一个临时表?
我有一个在 ubuntu 服务器上运行的 postgres 9.3 db。
大约一个月前,我们的 VPS 托管公司解决了服务器上的硬件问题。
问题很快得到解决,一切似乎都运行良好。
我们使用另一台服务器上的酒保运行备份 - 备份和恢复工作正常(我检查过)。
数据损坏的第一个迹象是几天前:我决定在我们的数据库上做一个完整的 pg_dump,就像我每隔一段时间做的那样,它失败了(块中的页头无效......) - 数据似乎已经很久以前就损坏了 - 大约在硬件问题发生的时候(那是损坏记录上的日期)。我求助于查找损坏的记录,然后将其删除并手动恢复。
在那之后,我能够做一个完整的 pg_dump。
为了检查其他损坏 - 我从备份中设置了不同的数据库服务器并对所有表运行 pg_repack 以验证我能够重建所有索引和表。
我的问题是:
1. 我如何确定我的数据库中没有任何额外的损坏?
2. 如何定期检查我的数据完整性?
3. 除了转储整个数据库并重新索引它(我已经这样做了)之外,我还能做些什么来验证我们数据库的完整性?
PS - 我没有启用块校验和。
我们正在尝试使用这些数字和查询要求来优化数据库的性能:
有了这些必要条件,我们就得出了这个解决方案(有一个很大的缺点,解释如下)。
[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]表:
pg_partman)进行分区。每个分区是一个月解释[B]表:
有一个后端进程详细说明了网络。
它每 3 分钟插入或更新每个段的状态。
换句话说,此过程将在一天开始时插入新行,并将每 3 分钟更新一次内部数组。
该解决方案的优点 …
当我在 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 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) 目前我有这个查询:
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) Postgres 10 获得了使用国际组件进行 Unicode (ICU)排序的能力,而不是依赖于主机操作系统的实现。请参阅Peter Eisentraut在 PostgreSQL 10 中使用 ICU 支持的更强大的排序规则。
那么在创建数据库时究竟如何指定 ICU 排序规则呢?
我确实在CREATE DATABASEto use 中阅读了一个提示,template0而不是template1iftemplate1可能是使用编码和整理而不是您想要的新数据库创建的。并且在使用时template0,您需要启用数据连接以覆盖默认值。
我在 Postgres 10 doc page for Collation 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
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)
另外,这里有懒惰的概念吗?所有功能都将“严格”应用?
我有一个看似简单的删除:
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并且我有一些以前的记录指向它,但是它们已经被删除了。
我试图:
VACUUM我的 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 ×10
array ×2
aggregate ×1
collation ×1
corruption ×1
delete ×1
international-components-unicode ×1
performance ×1
pg-hba.conf ×1
string ×1