标签: postgresql

使用 JSON 数组更新 Postgres 表

我正在使用 Postgres 9.5,我想弄清楚如何使用 JSON 数组更新 postgres 表。我希望数组中的每个对象都对应一个新行,每个键对应一个列,每个值都是要插入到该列中的数据。我试图用一个函数来做到这一点。这里的数据格式:

[
    { col1: a, col2: 5, col3: 1, col4: one},
    { col1: b, col2: 6, col3: 2, col4: two},
    { col1: c, col2: 7, col3: 3, col4: three},
    { col1: d, col2: 8, col3: 4, col4: four},
]
Run Code Online (Sandbox Code Playgroud)

这是我的预期输出:

 col1   (varchar)| col2 (integer) |   col3 (integer)   |   col4 (varchar)
-----------------+----------------+--------------------+------------------
    a            |  5             |     1              |    one
    b            |  6             |     2              |    two
    c            |  7             |     3              |    three
    d            | …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design stored-procedures

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

向模式中的所有表添加列的命令

如果表在模式中不包含该列,您能否给出向所有表添加一列的命令?

例如,模式schema1包含 50 个表,其中 20 个表包含名为 的列colTest

我需要将该列添加colTest到剩余的 30 个表中。

postgresql dynamic-sql postgresql-9.4

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

SQL 数据库中索引推荐使用的算法是什么?

我在 SQL Server 中使用了调优顾问工具,它根据给定的工作负载提供索引建议。

我想为 PostgreSQL 创建一个类似的工具。我浏览了一些研究论文。但我无法找到 SQL Server Tuning Adviser 用于提供索引建议的确切算法。

如果有人知道该算法或我可以从哪里获得该算法的任何来源,请指导我。请注意,我想根据工作负载提供建议,而不是针对单个查询。提前致谢。

postgresql index sql-server index-tuning

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

使用 pg_prewarm 将 X 个最新行加载到缓存中

我们有一个大型查询,当客户“第一次运行它时,一大早......”

所以,我发现pg_prewarm我想使用加载到 PG 的缓冲区缓存一定数量或最近访问的行(插入、更新或删除)来自上述查询中使用的几个表。

此外,我需要确保“预热”不超过 PG 的缓存(我相信是 shared_buffers 设置,还是我错了?)为了预热单个表的最后 1000 页,我可以这样做:

SELECT pg_prewarm(
    'mytable',
    -- "pre warm" last 1000 pages
    first_block := ( 
        SELECT pg_relation_size('mytable') / current_setting('block_size')::int4 - 1000
    )
);
Run Code Online (Sandbox Code Playgroud)

问题 1:这种方法有意义吗?

诀窍是 pg_prewarm 只能加载一定数量的页面,所以我需要计算“某个表的页面中有多少活动行”

-- show some settings
SELECT current_setting('block_size')::int4 AS page_size_bytes; -- 8192
SHOW shared_buffers; -- 512 MB


-- https://www.postgresql.org/docs/current/static/pgstattuple.html
--CREATE EXTENSION pgstattuple;
-- find out live row size and live rows per page
SELECT 'mytable'AS table_name, pg_size_pretty(tuple_len / tuple_count) AS live_row_size, 8192.00 / (tuple_len …
Run Code Online (Sandbox Code Playgroud)

postgresql performance size disk-space postgresql-performance

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

如何在 PostgreSQL 中永久设置“计时”?

我在命令行界面中使用 PostgreSQL。我想为集群中的每个数据库永久激活一个\timing命令,所以每次我连接到数据库时 - 这个参数是打开的。我在postgresql.conf文件中进行了搜索,但没有找到类似我想打开的内容。

我的 PostgreSQL 在 x86_64 Ubuntu 16.04.2 上是 9.5.4。

postgresql linux ubuntu configuration

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

用于存储用户配置文件的可空列或 jsonb?

我决定使用可为空字段或 jsonb 来存储用户配置文件。最初,这将用于联系人:emailphone。我预计稍后可能会添加其他列,例如mobilewebsite。此外,可能还有其他不相关的字段,例如设置/首选项、保存的搜索等。

我已经决定我不想为此使用任何形式的键值存储(或任何涉及多对多关系的模式),除非有非常好的理由。

jsonb 的优点:

  • 如有必要,可以为每个“列”存储多个值
  • 添加新字段只需要 JS 编码和文档

jsonb 的缺点:

  • 将“列”名称存储为每个“行”的字符串的开销
  • Wonky 执行比较查询(我认为我的使用场景不适用)
  • 不得不期待意外

还有什么要添加到这个优点/缺点列表中的吗?尽管我只想使用可为空的列,但我认为忽略 jsonb 是一种疏忽 - 这似乎是一个令人信服的选择。

schema postgresql null database-design json

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

如何在不更改客户端代码的情况下将 varchar 转换为 macaddr

我有一个带有 Debian Jessie 和 Postgresql 9.4 的专用数据库服务器

客户端:A 是一个 Tomcat Java 应用程序,它使用扭矩与连接到数据库服务器的 JDBC 驱动程序。

问题:在使用新值更新行时,更新失败,因为应用程序传输了错误的数据类型。

错误信息:

列“device_macaddr”的类型是 macaddr,但表达式的类型是在字符 159 处变化的字符

Torque 生成的更新语句:

UPDATE device SET device_last_change = $1, device_macaddr = $2 WHERE device_ID = $3
Run Code Online (Sandbox Code Playgroud)

postgresql 中数据类型的定义:

last_change is timestamp (0) without time zone NOT NULL
device_macaddr is macaddr NOT NULL
device_id is bigint NOT NULL
Run Code Online (Sandbox Code Playgroud)

我们最近确实将 DB 和 jdbc 驱动程序从 8.4 更新到 9.4

我能够查明对 jdbc 驱动程序的更改,但无法找到准确显示此行为更改的更改日志。

从那以后,上面的语句似乎不再起作用,而尽管当时可能是错误的数据类型,但它以前仍然起作用。

有没有办法“减轻”来自 Postgres 9.4 DB Server 的针对特定情况的严格检测?

我确实阅读了 jdbc 驱动程序的增强以包含那些额外的数据类型,但是这对我来说还没有用,所以我尝试在我拥有的选项的另一端找到解决方法。

postgresql jdbc cast

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

PostgreSQL 数据库不存在错误

我收到“数据库不存在错误”,即使数据库存在:

postgres=# GRANT ALL PRIVILEGES ON DATABASE Owino to OdooD;
Run Code Online (Sandbox Code Playgroud)

错误:数据库“owino”不存在

Name    |  Owner   | Encoding |   Collate   |    Ctype    |    Access privileges

Owino   | dominus  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
postgres| postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres           +
        |          |          |             |             | postgres=CTc/postgres  +
        |          |          |             |             | orokon=CTc/postgres    +
        |          |          |             |             | powerbidev=CTc/postgres+
        |          |          |             |             | odoodev=CTc/postgres
Run Code Online (Sandbox Code Playgroud)

postgresql

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

在 PostgreSQL 中使用 JSONB 从数组中删除对象

我试图从我的数据库中删除一个元素。我要删除的元素位于一个名为 playerContainer 的 JSON 对象中,该对象包含一个名为玩家的数组。这一切都位于一个名为 site_content 的表中。我正在尝试根据它的 ID 删除该对象。

这是示例 JSON

"playersContainer": {
        "players": [
            {
                "id": "1",
                "name": "Nick",
                "teamName": "Shire Soldiers",
                "ratings": [
                    1,
                    5,
                    6,
                    9
                ],
                "assists": 17,
                "manOfTheMatches": 20,
                "cleanSheets": 1,
                "data": [
                    3,
                    2,
                    3,
                    5,
                    6
                ],
                "totalGoals": 19

            },
}
Run Code Online (Sandbox Code Playgroud)

下面是我试图用来删除数组中的对象的查询

UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'id'->'players' #- '{1}'::jsonb
Run Code Online (Sandbox Code Playgroud)

但是,这似乎删除了表中内容行中的所有数据,而不仅仅是我的玩家数组中 ID 为 1 的数组。

postgresql delete update json

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

为什么 psql 会打开两个到 PostgreSQL 的 tcp 连接?

例如,如果我放置一个 iproute,就像这样

sudo iptables -I INPUT -p tcp --syn -m conntrack --ctstate NEW --ctstatus CONFIRMED --dport 5433 -j LOG
Run Code Online (Sandbox Code Playgroud)

我可以看到每次尝试连接到我的数据库时都有两个条目。

[598519.458578] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=192.168.0.101 DST=192.168.0.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49795 DF PROTO=TCP SPT=58554 DPT=5433 WINDOW=43690 RES=0x00 SYN URGP=0 
[598520.875428] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=192.168.0.101 DST=192.168.0.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=65392 DF PROTO=TCP SPT=58560 DPT=5433 WINDOW=43690 RES=0x00 SYN URGP=0 
Run Code Online (Sandbox Code Playgroud)

为什么 psql 需要在两个单独的端口(58554 和 58560)上连接到 PostgreSQL 服务器?也就是说,当我运行一次时,我会收到两条类似上面的消息..

psql -d test -h 192.168.0.101 -p 5433
Run Code Online (Sandbox Code Playgroud)

postgresql psql connectivity

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