标签: postgresql

如果过滤列有值,则查询结果优先

我有一个"customer_config"包含这些列的表:

company (varchar)
warehouse (numeric)
section (numeric)
config_keyword (varchar)
config_value (varchar)
Run Code Online (Sandbox Code Playgroud)

这两config_*列可以应用于整个公司(warehousesection为空)、公司内的整个仓库(section为空)或仓库内的一个部分。

因此,我们可以为公司设置一个默认行,然后使用一个或多个行来覆盖特定仓库或仓库和部分的配置值。

我只想返回给定公司、仓库和部门的最具体的行。像这样的伪代码:

results = select * from customer_config where (all match)
if results empty
    results = select * from customer_config where (company_code and warehouse match)
if results empty
    results = select * from customer_config where (company_code matches)
Run Code Online (Sandbox Code Playgroud)

最具体的行应优先。

更新

同一级别上可以有多个相同的条目config_keyword
是否也可以为单个关键字返回多行?

postgresql query precedence

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

Windows 上的 psql 自动完成

是否可以在 Windows 上启用自动完成功能psql?据我从 Linux 用户那里了解到,他们可以使用按键TAB来自动完成,我想这非常方便。

postgresql psql

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

我可以编写不带 OR IS NULL 的 FULL OUTER JOIN 吗?

这里有一些可以使用的数据:

CREATE TABLE a (
    a_id   int  NOT NULL,
    a_prop text NOT NULL
);

CREATE TABLE b (
    b_id   int  NOT NULL,
    b_prop text NOT NULL
);

INSERT INTO a VALUES (1, 'blah'), (2, 'blah'), (4, 'not this one');
INSERT INTO b VALUES (1, 'blah'), (3, 'blah'), (5, 'not this one');
Run Code Online (Sandbox Code Playgroud)

现在我想编写一个返回的查询:

结果

一种可能性是:

SELECT *
FROM a
FULL OUTER JOIN b ON a_id = b_id
WHERE (a_prop = 'blah' OR a_prop IS NULL)
AND (b_prop = 'blah' OR b_prop IS …
Run Code Online (Sandbox Code Playgroud)

postgresql join syntax

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

Postgres 多列排序

想象一下我有一个看起来像这样的结果集:

+----+------------+------------+
| Id |  Date_One  |  Date_Two  |
+----+------------+------------+
|  1 | 2022-05-12 | null       |
|  2 | 2022-05-13 | 2022-05-11 |
|  3 | null       | 2022-05-14 |
+----+------------+------------+
Run Code Online (Sandbox Code Playgroud)

我想首先根据最早的日期对结果进行排序,而不考虑列。每行将有一个Date_OneDate_Two填充。它们永远不会都为空。

因此上述结果集的结果将是:

+----+------------+------------+
| Id |  Date_One  |  Date_Two  |
+----+------------+------------+
|  2 | 2022-05-13 | 2022-05-11 |
|  1 | 2022-05-12 | null       |
|  3 | null       | 2022-05-14 |
+----+------------+------------+
Run Code Online (Sandbox Code Playgroud)

(因为 Id 2Date_Two早于 Id 1 Date_One)。

我不确定如何创建我的ORDER …

postgresql query order-by

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

将虚拟数据插入到具有主键整数字段 GENERATED ALWAYS AS IDENTITY 的空表中

我正在尝试使用虚拟数据生成虚拟表,以测试某些 SQL 任务的性能。

基于这个旧线程:有没有办法将多行插入到所有列都有默认值的表中?

我注意到,对于类型IDENTITY,不再可能使用建议的generate_series(1, N)解决方案用虚拟数据填充表。

那么,如何将 1'000 个虚拟数据插入到下表 (PG 14) 中,从而利用字段的默认值name而不覆盖字段的系统值id

CREATE TABLE foo (
    id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    name TEXT DEFAULT md5(random()::text)
);
Run Code Online (Sandbox Code Playgroud)

尝试以下操作失败:

INSERT INTO foo (id) 
  SELECT generate_series(1, 1000);

-- which results in:
ERROR:  cannot insert a non-DEFAULT value into column "id"
DETAIL:  Column "id" is an identity column defined as GENERATED ALWAYS.
HINT:  Use OVERRIDING SYSTEM VALUE to override.
SQL state: 428C9 …
Run Code Online (Sandbox Code Playgroud)

postgresql default-value

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

调整 Postgresql 以写入非关键数据库

DB用于存储市场报价,因此一天丢失数据是可以接受的。

所有写入操作均通过单个连接在一天的固定时间连续执行。

每天增加的数据量约为2GB。

由于预算削减,物理存储设备不得不从SSD改为传统硬盘,写入时间从10分钟改为2小时以上。

我应该如何调整 PG 配置以进行写入,尤其是使用传统硬盘?

环境:Ubuntu服务器20.04,Postgresql-11,CPU 4核,RAM 8G,写入时不需要做任何其他事情。

postgresql optimization

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

错误:无法从函数执行 CREATE MATERIALIZED VIEW ...WITH DATA

我需要CREATE MATERIALIZED VIEW ... WITH DATA从函数/过程执行,但我得到了ERROR: CREATE MATERIALIZED VIEW ... WITH DATA cannot be executed from a function.

除了使函数返回创建查询文本并复制粘贴以执行它之外,还有其他解决方法吗?

看起来真的很傻,但我想这背后有一个很好的理由......无论如何,这个限制有什么解决方法吗?

我正在运行 postgresql 15。

postgresql stored-procedures materialized-view functions postgresql-15

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

pg_restore 在导入备份时都会抱怨数据库是否存在

Postgresql 版本:15 备份是从版本 12 开始的。

(我不知道 --schema-only 是否是问题的一部分。)

我有一个数据库的备份 tar 文件,我正在尝试恢复它,但我一直遇到奇怪的冲突。

如果我预先创建数据库weatherdata并尝试使用该--create选项,则会收到数据库已存在的预期错误。

postgres@logs:~$ pg_restore -e --create --schema-only -U postgres -d weatherdata /home/geuis/postgres-bak-3-31-22.tar 
pg_restore: error: could not execute query: ERROR:  database "weatherdata" already exists
Command was: CREATE DATABASE weatherdata WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
Run Code Online (Sandbox Code Playgroud)

但是如果我删除数据库然后运行相同的命令,它会抱怨weatherdata 存在

postgres=# DROP DATABASE weatherdata;
DROP DATABASE
postgres=# exit
postgres@logs:~$ pg_restore -e --create --schema-only -U postgres -d weatherdata /home/geuis/postgres-bak-3-31-22.tar 
pg_restore: error: connection …
Run Code Online (Sandbox Code Playgroud)

postgresql pg-restore

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

PostgreSQL 使用哪种数据类型来存储浮点数字更好?为什么?

我有一个 Laravel 应用程序需要存储最小和最大权重。目前,我们使用整数值来存储数据,但我需要修改它以使用浮点存储数据值。为了获得良好的准确性,我必须使用什么数据类型?

postgresql floating-point

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

一次(保证)更改后索引对“状态”字段的影响

介绍

我有一个 PostgreSQL 表设置作为队列/事件源。

我非常希望保留事件的“顺序”(即使在处理队列项之后)作为 e2e 测试的来源。

我开始遇到查询性能下降的问题(可能是因为表膨胀),并且我不知道如何有效地查询不断变化的键上的表。

初始设置

Postgres:v15

表DDL

CREATE TABLE eventsource.events (
    id serial4 NOT NULL,
    message jsonb NOT NULL,
    status varchar(50) NOT NULL,
    createdOn timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT events_pkey PRIMARY KEY (id)
);
CREATE INDEX ON eventsource.events (createdOn)
Run Code Online (Sandbox Code Playgroud)

抓取查询(伪代码)

BEGIN;  -- Start transaction

SELECT message, status
FROM eventsource.events ee
WHERE status = 'PENDING'
ORDER BY ee.createdOn ASC
FOR UPDATE SKIP LOCKED
LIMIT 10;  -- Get the OLDEST 10 events that are pending
-- I …
Run Code Online (Sandbox Code Playgroud)

postgresql index queue event query-performance

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