我正在努力使用 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。
我想执行以下操作:
SELECT person, MAX( (date, priority) ) FROM table GROUP BY person;
Run Code Online (Sandbox Code Playgroud)
它将为列中的每个不同值返回一个person,date和priority行person。的date和priority被选择为使得所述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 中创建数据库时,我是该数据库下除架构之外的所有对象的所有者。是否有理由默认 postgres 角色是架构所有者?我想不出对此设置的任何解释。只是好奇 ...
在触发器主体中,如何NEW通过其字段名称为其分配值?
这就是我想要做的:
some_key = "some_column";
NEW[some_key] = 5;
Run Code Online (Sandbox Code Playgroud) 我的 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。
我怎样才能防止这种情况?为了每次成功插入一行,主键是相关的
我的表:
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) 该文件说:
限制和级联删除是两个最常见的选项。RESTRICT 防止删除引用的行。NO ACTION 意味着如果检查约束时仍然存在任何引用行,则会引发错误;如果您未指定任何内容,则这是默认行为。(这两个选择之间的本质区别是 NO ACTION 允许将检查推迟到事务的后期,而 RESTRICT 不允许。) CASCADE 指定当删除引用的行时,应自动删除引用它的行以及。还有另外两个选项:SET NULL 和 SET DEFAULT。当引用的行被删除时,这些会导致引用行中的引用列分别设置为空值或它们的默认值. 请注意,这些并不能免除您遵守任何约束条件。例如,如果操作指定了 SET DEFAULT 但默认值不满足外键约束,则操作将失败。
但是没有说明on delete set null如果只有一个外键列可以为空,或者如果它只是将可空部分设置为空,是否会失败,是吗?
假设有两个表:
用户
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)
随着单查询我要检索:
我希望输出按电子邮件数量降序排列并过滤,仅包括以“a”开头的电子邮件。没有电子邮件的用户也应包括在内 - 将他们的电子邮件计数视为0。 …
出于性能原因,我正在编写一个大型的多步 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) 我正在尝试在单个事务中执行 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 ×10
aggregate ×1
cascade ×1
cte ×1
foreign-key ×1
functions ×1
join ×1
json ×1
plpgsql ×1
primary-key ×1
psql ×1
transaction ×1
trigger ×1