标签: postgresql

LISTEN 的问题 - PostgreSQL 中的 NOTIFY 机制

我正在努力使用 PostgreSQL LISTEN - NOTIFY 机制。我打开两个控制台并使用 psql 客户端连接到我的数据库:

psql -U postgres test_db
Run Code Online (Sandbox Code Playgroud)

在第一个控制台中,我订阅了一些通知:

test_db=# listen event;
LISTEN
Run Code Online (Sandbox Code Playgroud)

在第二个控制台中,我尝试发送通知:

test_db=# notify event;
NOTIFY
Run Code Online (Sandbox Code Playgroud)

第一个控制台没有任何反应。但是,如果我从控制台 1 发送通知,我会收到它,并且还会从控制台 2 收到所有以前的通知。

我在 CentOS 6.5 x64 下使用 PostgreSQL 9.2.1。

postgresql postgresql-9.2

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

我可以在一对列上执行 MAX 吗?

我想执行以下操作:

SELECT person, MAX( (date, priority) ) FROM table GROUP BY person;
Run Code Online (Sandbox Code Playgroud)

它将为列中的每个不同值返回一个person,datepriorityperson。的datepriority被选择为使得所述date值被最大化,且最大priority发生在该日期被选择。

例如,在此表上运行查询

person |     date     | priority
---------------------------------
   1   | '2014-01-01' |    10
   1   | '2014-01-02' |     2
   1   | '2014-01-02' |     3
Run Code Online (Sandbox Code Playgroud)

应该导致

person |     date     | priority
---------------------------------
   1   | '2014-01-02' |     3
Run Code Online (Sandbox Code Playgroud)

Postgres 抱怨这种特殊的尝试:

ERROR:  function max(record) does not exist
HINT:  No function matches the given name …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate

5
推荐指数
2
解决办法
8716
查看次数

PostgreSQL:为什么架构所有者不是数据库所有者

我有一个简单的问题,但我无法从官方文档中找到答案。当我以特定用户的身份在 PostgreSQL 中创建数据库时,我是该数据库下除架构之外的所有对象的所有者。是否有理由默认 postgres 角色是架构所有者?我想不出对此设置的任何解释。只是好奇 ...

postgresql

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

通过 Postgres 触发器中的键分配给 NEW

在触发器主体中,如何NEW通过其字段名称为其分配值?
这就是我想要做的:

some_key = "some_column";
NEW[some_key] = 5;
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql functions

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

当 PostgreSQL 中的 INSERT 语句失败时防止主键增量

我的 PostgreSQL 数据库中有一个简单的表,如下所示:

CREATE TABLE person_type
(
  id serial NOT NULL,
  name character(55) NOT NULL,
  CONSTRAINT person_type_pkey PRIMARY KEY (id),
  CONSTRAINT person_type_name_key UNIQUE (name)
)
Run Code Online (Sandbox Code Playgroud)

如您所见,id会自动递增,并且名称必须是唯一的。每次我运行 INSERT sql 语句时,即使它失败,id 也会增加 1。

我怎样才能防止这种情况?为了每次成功插入一行,主键是相关的

postgresql primary-key auto-increment

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

如何从json数组中删除对象?

我的表:

CREATE TABLE items (
    id BIGINT PRIMARY KEY NOT NULL,
    name VARCHAR,
    images json
);
Run Code Online (Sandbox Code Playgroud)

图片格式:

[
  {
    "id": "owner",
    "full": "<url>",
    "thumb": "<url>"
  },
  {
    "id": "note_0",
    "full": "<url>",
    "thumb": "<url>"
  },
  {
    "id": "note_1",
    "full": "<url>",
    "thumb": "<url>"
  },
  {
    "id": "note_2",
    "full": "<url>",
    "thumb": "<url>"
  }
]
Run Code Online (Sandbox Code Playgroud)

我需要这样的东西:

UPDATE items SET images = delete(images, 'note_1');
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3 json

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

我可以在包含主键列的复合外键上使用 `on delete set null` 吗?

文件说

限制和级联删除是两个最常见的选项。RESTRICT 防止删除引用的行。NO ACTION 意味着如果检查约束时仍然存在任何引用行,则会引发错误;如果您未指定任何内容,则这是默认行为。(这两个选择之间的本质区别是 NO ACTION 允许将检查推迟到事务的后期,而 RESTRICT 不允许。) CASCADE 指定当删除引用的行时,应自动删除引用它的行以及。还有另外两个选项:SET NULL 和 SET DEFAULT。当引用的行被删除时,这些会导致引用行中的引用列分别设置为空值或它们的默认值. 请注意,这些并不能免除您遵守任何约束条件。例如,如果操作指定了 SET DEFAULT 但默认值不满足外键约束,则操作将失败。

但是没有说明on delete set null如果只有一个外键列可以为空,或者如果它只是将可空部分设置为空,是否会失败,是吗?

postgresql foreign-key postgresql-9.3 cascade

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

按引用表中的相关行数排序

假设有两个表:

用户

id [pk] |   name
--------+---------
      1 | Alice
      2 | Bob
      3 | Charlie
      4 | Dan
Run Code Online (Sandbox Code Playgroud)

电子邮件

 id | user_id | email 
----+---------+-------
  1 |       1 | a.1
  2 |       1 | a.2
  3 |       2 | a.3
  4 |       2 | b.1
  5 |       2 | a.4
  6 |       2 | a.5
  7 |       3 | b.2
  8 |       3 | a.6
Run Code Online (Sandbox Code Playgroud)

随着查询我要检索:

  • 用户的 ID 和名称
  • 用户的电子邮件数
  • 用户的电子邮件及其 ID

我希望输出按电子邮件数量降序排列并过滤,仅包括以“a”开头的电子邮件。没有电子邮件的用户也应包括在内 - 将他们的电子邮件计数视为0。 …

postgresql join window-functions postgresql-9.3

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

在不确定性下管理 CTE 执行顺序

出于性能原因,我正在编写一个大型的多步 CTE 。

在一个查询中,数据必须从一个表移动到另一个表,但移动的行数是不确定的,可能为零。

在后续表中,删除来自前一个查询的源,但必须在完成前一个查询之后。

最后,在上面的第二个查询完成后,必须写入行来代替已删除的行。

在前两个查询中,我使用 RETURNING 来强制执行顺序。

在第二个查询中,我确定第一个查询是由这个子查询完成的

(SELECT COUNT(*) FROM first_query) >= 0
Run Code Online (Sandbox Code Playgroud)

在第三个查询中,我确定第二个查询是由这个子查询完成的

SELECT EXISTS (SELECT 1 FROM second_query)
Run Code Online (Sandbox Code Playgroud)

确定第一个查询已完成的子查询是否正确?

用于确定必须返回行的第二个查询已完成最佳准确性、精度和性能的子查询?

使用上述子查询来强制执行顺序会导致重复的键值违规。

查询小节

WITH copy_to_other_table AS (
    INSERT INTO other_table (column_a, column_b) 
        SELECT column_a, column_b 
            FROM main_table
        WHERE column_a = $1::bigint
        RETURNING *
),
main_table_deleted AS (
    DELETE FROM main_table WHERE column_a = $1::bigint 
        AND (SELECT COUNT(*) FROM copy_to_other_table) >= 0         
        RETURNING *
)
INSERT INTO main_table (column_a, column_b) 
        SELECT column_a, column_b 
            FROM another_table …
Run Code Online (Sandbox Code Playgroud)

postgresql cte unique-constraint

5
推荐指数
2
解决办法
2226
查看次数

回滚 psql 中的 \include 错误

我正在尝试在单个事务中执行 sql 脚本文件。该文件包含一些其他脚本的包含,这些脚本在我的示例中创建了一些表。它看起来像这样:

\include ../tables/table1.cre
\include ../tables/table2.cre
...
\include ../tables/table10.cre
Run Code Online (Sandbox Code Playgroud)

我正在使用psql

psql -X --set AUTOCOMMIT=off --set ON_ERROR_STOP=on -e --single-transaction -d my_db -f my_script.sql
Run Code Online (Sandbox Code Playgroud)

问题是 include meta 命令的错误不会导致事务回滚。例如,如果某些 tableX.cre 文件丢失,则将提交其包含之前的任何更改。但是,如果有一些 SQL 语法错误,一切都会按预期工作。

是否有可能以某种方式处理包含相关错误并回滚活动事务?

我正在使用 PostgreSQL 9.2.1。

postgresql psql transaction postgresql-9.2

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