我的开发服务器上有两个 PostgreSQL 数据库,一个用于开发,另一个用于测试 Web 应用程序的生产。当我使用早期版本的 PostgreSQL 时,我能够在 pgAdmin 中轻松创建我的 prod 数据库的 TAR 转储文件,并在选择首先清理数据库的选项后使用相同的 TAR 文件来恢复我的开发数据库。不久前,我将 pgAdmin 升级到了应该可以与 PostgreSQL 9.4 一起使用的版本(我认为是 1.20.0)。无论出于何种原因,我无法恢复该版本中的文件。我尝试过 TAR 和 SQL,但恢复按钮始终受到保护。
我决定使用pg_dump
并创建一个仅包含生产数据库数据插入语句的 SQL 文件。我想做的是复制我在 pgAdmin 中能够做的事情:清理我的开发数据库并将我的pg_dump
SQL 文件加载到其中。
我已经搜索过,但到目前为止我还没有找到任何如何在 pgAdmin 或终端中执行此操作的示例。
我正在尝试编写 Postgres 触发器以在插入或更新新行之前取消嵌套数组字段。例如
SELECT
unnest(something)
FROM NEW
Run Code Online (Sandbox Code Playgroud)
但是,这似乎会导致错误:
关系“新”不存在
如何使用触发器函数内的 NEW 行,以允许我取消嵌套数组字段以进行进一步处理?
创建表语句
以下是表结构的示例:
CREATE TABLE parent_table (
id uuid NOT NULL,
jsonb_array_field jsonb[] NOT NULL DEFAULT '{}'::jsonb[],
CONSTRAINT "parent_table_pkey" PRIMARY KEY (id),
);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE many_to_one_table (
id serial primary key,
parent_table_id uuid references parent_table(id),
subfield_a text,
subfield_a text
);
Run Code Online (Sandbox Code Playgroud)
触发功能
下面是 TRIGGER 函数的本质:
CREATE OR REPLACE FUNCTION unnest_and_normalize_json() RETURNS TRIGGER AS
$body$
begin
if NEW.jsonb_array_field is null then
raise exception 'jsonb_array_field is null';
else
insert into
many_to_one_table(subfield_a, subfield_b) …
Run Code Online (Sandbox Code Playgroud) 我有一个物化视图,创建大约需要 57 秒,并且我使用的是 PostgreSQL 9.4。
当我插入表时,触发器将调用触发器函数,该函数将REFRESH MATERIALIZED VIEW CONCURRENTLY view
触发触发器after each statement
(插入、更新、删除)
发生的情况是,执行插入操作大约需要 57 秒。
如何解决此问题并仍然使用物化视图?
我已经实现了很长时间,从来没有出现过这个问题,最近我添加了pgbouncer,会不会是这个原因?
这里不是关键问题,只是好奇。
我正在通过在 PostgreSQL 中运行的基础中的多个脚本插入数据。
我想测试请求结束插入的时间,所以我多次请求表中的行数如下:
SELECT COUNT(*) FROM "table";
Run Code Online (Sandbox Code Playgroud)
我注意到每次行数都遵循一个模式:最后一位数字(百位、十位和单位)与第一位(百万和千位)相同。
举例:
39039
,8526518
(8518000 + 8518)更多信息 :
psql 上的行为相同。
我通过连接到底座来添加 1k 个插入物,所以我认为它不相关。
当插入结束时,返回正确的行数。
我做了足够多的请求以确保这不是巧合。
我在 Windows 上工作。
我正在使用一个jsonb
列,其中 JSON 文档包含大整数 (PostgreSQL 9.5)。我注意到,当存储的值有太多有效数字时,它会被截断。
作为示例,我将其插入到我的表中:
{"value": 7598786232076607106}
Run Code Online (Sandbox Code Playgroud)
当我选择返回同一行时,我得到:
{"value": 7598786232076607000}
Run Code Online (Sandbox Code Playgroud)
根据文档numeric
,jsonb 中的数字字段使用postgres 的标准类型存储,并且numeric
通常允许:
小数点前最多 131072 位;小数点后最多 16383 位
jsonb
是否有可能通过, 而不是截断来真正获得这种行为?
我正在努力处理随机返回多行而不是一行的查询。我正在使用 PostgreSQL 9.4.12
查询如下:
UPDATE folder as f set locked = 'locked', date_locked = current_timestamp
from (
SELECT * from folder as f2
WHERE f2.locked = 'available'
LIMIT 1 FOR UPDATE ) as folderToUpdate
WHERE f.id = folderToUpdate.id returning f.*
Run Code Online (Sandbox Code Playgroud)
的id
是主键。
它是通过一系列集成测试执行的。当我只执行上述查询的测试时,我没有任何问题。但是,当我执行所有测试时,我随机得到多行。你有什么建议吗?
从带有列的表中: id(pk), type_id, book_id, title_id, page_id, lines(int4), created_at(date)
如何选择带有min(lines)
和max(lines)
for (type_id, book_id, title_id, page_id) 的行以及created_at
when min(lines) 的值和最大值的值。
虚拟数据:
type_id, book_id, title_id, page_id, lines, created_at
1, 1, 1, 1, 12, 2015-04-01
1, 1, 1, 1, 10, 2015-03-01
1, 1, 1, 1, 11, 2015-03-02
1, 1, 1, 2, 3, 2015-04-01
1, 1, 1, 2, 5, 2015-03-01
1, 1, 1, 2, 6, 2015-03-04
Run Code Online (Sandbox Code Playgroud)
预期输出:
type_id, book_id, title_id, page_id, min, min_created_at, max, max_created_at
1, 1, 1, 1, 10, 2015-03-01, …
Run Code Online (Sandbox Code Playgroud) 这是我上一个问题的后续/是否可以在 PostgreSQL 中插入货币数据类型的未格式化数据
我可以通过将其类型转换为数字来读取货币数据
SELECT '52093.89'::money::numeric
Run Code Online (Sandbox Code Playgroud)
它会给出不一致的数据,四舍五入等吗?
根据 ISO 标准,money
数据类型大小为 (19,4) 但为什么 PostgreSQL 返回大小为 2147483647?这个大小取决于语言环境吗?
使用money
数据类型来存储/检索特定于区域设置的值是个好主意吗?如果不是,什么时候money
数据类型最合适?
我必须在money
某些情况下使用数据类型。我担心的是,如果我将money
数据类型值视为十进制值,我会遇到任何问题吗?
我不关心特定于语言环境的值,例如符号、数字和十进制分组等。我可以根据lc_monetary
设置存储货币数据类型值并通过将其类型转换为读取numeric
吗?
PostgreSQL
: 9.4
FreeBSD
: 11.2
当我将TimeZone
参数设置为postgresql.conf
时,localtime
在尝试启动 PostgreSQL 时收到以下错误。
service postgresql restart
<2022-06-02 11:18:27.612 EDT> LOG: invalid value for parameter "TimeZone": "localtime"
<2022-06-02 11:18:27.613 EDT> FATAL: configuration file "/usr/local/pgsql/data/postgresql.conf" contains errors
pg_ctl: could not start server
Examine the log output.
Run Code Online (Sandbox Code Playgroud)
在我的搜索过程中,我发现了这个对应关系,这似乎表明 /etc/localtime 应该是一个符号链接。我的不是,所以我尝试将其更改为符号链接,但它仍然不起作用,因为我得到了与上面相同的错误。
mv /etc/localtime /etc/localtime.bak
ln -s /usr/share/zoneinfo/America/Yellowknife
shutdown -r now
ls -la /etc/localtime
lrwxr-xr-x 1 root wheel 35 Jun 2 11:04 /etc/localtime -> /usr/share/zoneinfo/America/Yellowknife
Run Code Online (Sandbox Code Playgroud)
可以开始TimeZone
工作localtime
吗FreeBSD …
postgresql ×7
pgadmin ×3
concurrency ×1
json ×1
money ×1
pg-dump ×1
pgbouncer ×1
subquery ×1
trigger ×1
update ×1