标签: postgresql-9.4

如何将使用 pg_dump 创建的纯数据转储加载到另一个数据库?

我的开发服务器上有两个 PostgreSQL 数据库,一个用于开发,另一个用于测试 Web 应用程序的生产。当我使用早期版本的 PostgreSQL 时,我能够在 pgAdmin 中轻松创建我的 prod 数据库的 TAR 转储文件,并在选择首先清理数据库的选项后使用相同的 TAR 文件来恢复我的开发数据库。不久前,我将 pgAdmin 升级到了应该可以与 PostgreSQL 9.4 一起使用的版本(我认为是 1.20.0)。无论出于何种原因,我无法恢复该版本中的文件。我尝试过 TAR 和 SQL,但恢复按钮始终受到保护。

我决定使用pg_dump并创建一个仅包含生产数据库数据插入语句的 SQL 文件。我想做的是复制我在 pgAdmin 中能够做的事情:清理我的开发数据库并将我的pg_dumpSQL 文件加载到其中。

我已经搜索过,但到目前为止我还没有找到任何如何在 pgAdmin 或终端中执行此操作的示例。

pgadmin pg-dump postgresql-9.4

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

在 Postgres 触发器的 FROM 子句中使用 NEW?

我正在尝试编写 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)

postgresql trigger subquery postgresql-9.4

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

使用实体化视图

我有一个物化视图,创建大约需要 57 秒,并且我使用的是 PostgreSQL 9.4。

当我插入表时,触发器将调用触发器函数,该函数将REFRESH MATERIALIZED VIEW CONCURRENTLY view触发触发器after each statement(插入、更新、删除)

发生的情况是,执行插入操作大约需要 57 秒。

如何解决此问题并仍然使用物化视图?

我已经实现了很长时间,从来没有出现过这个问题,最近我添加了pgbouncer,会不会是这个原因?

postgresql materialized-view pgbouncer postgresql-9.4

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

PgAdmin III - 插入期间返回的行数

这里不是关键问题,只是好奇。

我正在通过在 PostgreSQL 中运行的基础中的多个脚本插入数据。

我想测试请求结束插入的时间,所以我多次请求表中的行数如下:

SELECT COUNT(*) FROM "table";
Run Code Online (Sandbox Code Playgroud)

我注意到每次行数都遵循一个模式:最后一位数字(百位、十位和单位)与第一位(百万和千位)相同。

举例:

  • 如果大约有 39k 行,则返回的行数为39039
  • 如果大约有 8518k 行,则返回的行数为8526518 (8518000 + 8518)

知道它来自哪里吗?是默认吗?或者也许是个人配置?


更多信息 :

  • psql 上的行为相同。

  • 我通过连接到底座来添加 1k 个插入物,所以我认为它不相关。

  • 当插入结束时,返回正确的行数。

  • 我做了足够多的请求以确保这不是巧合。

  • 我在 Windows 上工作。

pgadmin postgresql-9.4

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

jsonb 和数字精度和小数位数

我正在使用一个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 json postgresql-9.4

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

带有子查询 LIMIT 1 的 UPDATE 返回多行

我正在努力处理随机返回多行而不是一行的查询。我正在使用 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是主键。

它是通过一系列集成测试执行的。当我只执行上述查询的测试时,我没有任何问题。但是,当我执行所有测试时,我随机得到多行。你有什么建议吗?

postgresql concurrency update postgresql-9.4

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

从表中获取最小和最大行

从带有列的表中: 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_atwhen 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 postgresql-9.4

0
推荐指数
1
解决办法
3624
查看次数

处理 MS-SQL 和 PostgreSQL 货币数据类型之间的差异

这是我上一个问题的后续/是否可以在 PostgreSQL 中插入货币数据类型的未格式化数据

  1. 我可以通过将其类型转换为数字来读取货币数据

     SELECT '52093.89'::money::numeric
    
    Run Code Online (Sandbox Code Playgroud)

    它会给出不一致的数据,四舍五入等吗?

  2. 根据 ISO 标准,money数据类型大小为 (19,4) 但为什么 PostgreSQL 返回大小为 2147483647?这个大小取决于语言环境吗?

  3. 使用money数据类型来存储/检索特定于区域设置的值是个好主意吗?如果不是,什么时候money数据类型最合适?

我必须在money某些情况下使用数据类型。我担心的是,如果我将money数据类型值视为十进制值,我会遇到任何问题吗?

我不关心特定于语言环境的值,例如符号、数字和十进制分组等。我可以根据lc_monetary设置存储货币数据类型值并通过将其类型转换为读取numeric吗?

postgresql pgadmin money postgresql-9.4

0
推荐指数
1
解决办法
817
查看次数

在 Postgresql 中,如何将本地时间作为时区以在 FreeBSD 上工作?

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工作localtimeFreeBSD …

postgresql postgresql-9.4

0
推荐指数
1
解决办法
318
查看次数