只是想了解这里的想法......
此错误说明对于其他数据库,您可以在发生 SQLException 后运行其他命令。它写于 2001 年,但从未接触过。我们正在使用 Postgres 和 SQL Server,所以现在我们遇到了这个问题。
假设你有:
start transaction;
create table test(id int primary key);
insert into test values (1);
commit;
-- Following statement throws a SQLException(duplicate key) in
-- PG, SS and ORacle
insert into test values (1);
-- Following statement behaves differently for different DBMS:
-- SS and OR: No error...statement runs fine
-- PG: Another SQLException thrown...must rollback or commit
insert into test values (99);
Run Code Online (Sandbox Code Playgroud)
谁能帮助我理解为什么 Postgres 不允许这样做?或者更好的是,是否有连接标志来改变行为?(我看了看,没有找到任何东西。)
我在上面添加了“开始事务”位以表明它不是自动提交的 tx。
这是一个 …
我有两个表,外键来自 T1->T2,处于一对多关系。也就是说,表 T1 中的 1 个元组与 T2 中的 0..N 个元组相关联。
为了创建一个简单的例子,假设 T1 是汽车,而 T2 是一个缺陷表。因此,一辆汽车可以有 0..N 个缺陷,我们将这些缺陷作为整数存储在 T2 中。
我想仅从包含缺陷 i1和i2 的汽车中的那些汽车中选择 * 。
相反,执行 OR 非常简单:
SELECT * FROM cars AS T1
WHERE EXISTS (
SELECT imperfection FROM Imperfections as T2
WHERE T1.uid = T2.uid AND (imperfection = 1 OR imperfection = 2)
);
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用交集设置逻辑,但在这一点上,我想知道我是否过于复杂了。
我有一个问题,关于 Postgres 中数组列的内部处理。引擎是否将其作为具有内存分配的经典数组来处理,还是以某种方式是指针列表。
知道会很有趣 - 我有几个关于性能的问题需要回答...... :)
我最近问了关于 MySQL 的同样问题,它已经迁移到 Postgres。 老问题。
把它们加起来:
我有一个带有 id(类型 UUID)、时间戳和一些文本(row3)的表。如何为 row3 的每个不同值每小时仅保留一个条目?
我试过的是这样的:
INSERT INTO log_table
SELECT * FROM table1
WHERE id IN (
SELECT DISTINCT ON(id) id
FROM table1
GROUP BY row3, EXTRACT(HOUR FROM "time"), id
);
TRUNCATE table1;
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这会插入 table1 中的每一行。
我正在使用 Postgres 9.2.1 并将我的可存档 WAL 保存在 NFS 共享上。
我只使用基本命令,在 postgresql.conf 中作为示例给出
test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f
cp 命令是否以某种方式保护我的备份服务器,它读取 WAL 档案,不读取一半复制的 WAL 文件?我是否必须手动定义一个cp命令,让文件以 结尾,.tmp然后调用rename以给它正确的名称?
有人有保存的例子archive_command吗?
我有一个父行,然后有许多子行,我必须汇总这些子行的统计信息。
对于更具体的示例,让我们假设我有一轮高尔夫球(父行),然后是带有每个洞得分的子行。我需要汇总这些行的统计数据,例如小鸟数、标准杆数、转向架数、推杆数等等。然后将这些数字放入一个 round_detail 表中。
什么是最好的解决方案?
如果重要的话,我正在使用 postgres,但这可能只是一个一般的 sql 问题。
我想从 pl/pgsql 返回一组记录。有没有办法在不使用“for”构造和游标的情况下做到这一点?例如,当我比较这两个存储过程时:
create or replace function sqlProc () returns setof integer as $$
select * from foo;
$$ language sql;
create or replace function plpgSqlProc () returns setof integer as $$
declare
c integer;
begin
for c in select * from foo loop
return next c;
end loop;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
纯 SQL 版本的时间性能是 pl/pgsql 版本的 2 倍!不幸的是,我还有其他无法用纯 SQL 表达的逻辑,所以我想知道应该如何编写存储过程?
postgresql stored-procedures plpgsql set-returning-functions
我已经使用 postgresql 规则实现了数据非规范化策略。出于性能原因,我选择了规则而不是触发器。
架构的结构如下:
系统的一部分是将hits每个用户存储在stats表中。命中是一个虚构的指标,它并不真正相关。系统可以收集许多这些指标。统计表中有很多记录(每天> 1,000,000)。
我想知道给定日期内每个用户、每个项目、每个客户端和每个应用程序的点击次数是多少。
为了使其快速运行,我按天对统计信息进行了分组,并将输出存储到 user_hits 表中。在此过程中,还添加了 application_id、client_id 和 project_id(作为列),并创建了适当的索引。
我想通过按 project_id、client_id 和最后的 application_id 对事物进行分组来进一步优化流程。数据管道是这样的:
stats -> user_hits -> project_hits -> client_hits -> application_hits
我想确保当我删除user_hits给定日期的数据时project_hits,同一日期的数据也被删除。这个过程应该传播到链中的最后一个表。
我定义了这些简单的规则:
CREATE RULE delete_children AS ON DELETE TO user_hits
DO ALSO
DELETE FROM project_hits WHERE day = OLD.day;
CREATE RULE delete_children AS ON DELETE TO project_hits
DO ALSO
DELETE FROM client_hits WHERE day = OLD.day;
CREATE RULE delete_children AS ON DELETE …Run Code Online (Sandbox Code Playgroud) 作为 postgres 用户,create extension plpython3u;我的数据库中有
然后我已将其设置plpython3u为受信任:select lanpltrusted from pg_language where lanname like 'plpython3u';返回 true
但是当我的 db_user 尝试
create function check_data_valid(id bigint)
returns boolean
as $$
-- ...
return true
$$ language plpython3u;
Run Code Online (Sandbox Code Playgroud)
我得到了错误: permission denied for the language plpython3u
所以,我的Postgres的用户,然后我曾尝试:grant usage on plpython3u to db_user和grant execute on plpython3u to db_user,但都返回错误:
relation python doesn't exist
也许是因为它是一个扩展......但是,我不知道该怎么做才能创建我的存储过程。
在查看pl/pythonand 的几个示例时pl/pgsql,我看到许多(但不是全部)使用volatile cost.
IE:
CREATE OR REPLACE FUNCTION my_function()
RETURNS setof record AS
$BODY$
-- code
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Run Code Online (Sandbox Code Playgroud)
搜索有关volatile cost我的更多信息时发现(乍一看)大约至少 90% 的网络示例都在使用volatile cost 100,有时有时会使用volatile cost 1。(因为rows它是 1000)。
据我了解,此指示有助于查询计划优化器决定如何在短路布尔运算中设置优先级。
如果我开始给出估计值cost或rows对我的每个存储过程进行估计,是否过早优化?我应该只在我想优化某些查询时才这样做吗?选择成本的良好价值是一门艺术吗?
我知道命令explain,我还没有学会。这个命令对估计有帮助cost吗?
postgresql ×10
aggregate ×1
array ×1
backup ×1
optimization ×1
plpgsql ×1
plpython ×1
transaction ×1