小编Erw*_*ter的帖子

带有 IN() 参数的 PostgreSQL PREPARE 查询

我正在尝试从 PHP 准备一个查询,例如:

pg_prepare($con, "prep", "select * from test where tid in ($1)");
Run Code Online (Sandbox Code Playgroud)

然后执行它:

$strpar = "3,4,6,8,10";
pg_execute($con, "prep", array($strpars));
Run Code Online (Sandbox Code Playgroud)

问题是我无法传递一系列构建为 prepare 期望固定数量参数的值。有没有办法使参数动态?

postgresql prepared-statement php array

10
推荐指数
1
解决办法
5424
查看次数

选择两个日期之间的 COUNT 天(周末除外)

我试图获得两个不同日期之间的天数,周末除外。

我不知道如何达到这个结果。

postgresql datetime

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

如何仅根据字段名称访问 NEW 或 OLD 字段?

我正在编写一个验证触发器。触发器必须验证数组的总和是否等于另一个字段。由于我有许多此验证的实例,因此我想编写一个过程并创建多个触发器,每个触发器都有一组不同的要检查的字段。

例如,我有以下架构:

CREATE TABLE daily_reports(
     start_on date
   , show_id uuid
   , primary key(start_on, show_id)

     -- _graph are hourly values, while _count is total for the report
   , impressions_count bigint not null
   , impressions_graph bigint[] not null

   -- interactions_count, interactions_graph
   -- twitter_interactions_count, twitter_interactions_graph
);
Run Code Online (Sandbox Code Playgroud)

验证必须确认impressions_count = sum(impressions_graph)

我被卡住了,因为我不知道如何NEW从 plpgsql 中动态访问一个字段:

CREATE FUNCTION validate_sum_of_array_equals_other() RETURNS TRIGGER AS $$
DECLARE
  total bigint;
  array_sum bigint;
BEGIN
  -- TG_NARGS = 2
  -- TG_ARGV[0] = 'impressions_count'
  -- TG_ARGV[1] = 'impressions_graph'

  -- How …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql composite-types

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

从 SELECT 与单个值组合的 INSERT

我有这个查询返回几行item_id

select item_id from properties where name like 'body';   
Run Code Online (Sandbox Code Playgroud)

我有第二个返回 1 行的tag_id

select id from tags where name ilike '%hoax%';   
Run Code Online (Sandbox Code Playgroud)

我想使用这两个结果在第三个表中创建新行,item_tags以便我可以将item_id第一个查询中的每个结果插入tag_id到第二个查询中。

我会有类似的东西:

INSERT INTO item_tags (item_id, tag_id) VALUES (item_id1, tag_id);  
INSERT INTO item_tags (item_id, tag_id) VALUES (item_id2, tag_id);
INSERT INTO item_tags (item_id, tag_id) VALUES (item_id3, tag_id);   
 ...     
Run Code Online (Sandbox Code Playgroud)

第一个查询返回超过 800 行。如何自动化插入?
psql 9.1.11,Postgres 9.1.4。

postgresql insert postgresql-9.1

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

明确授予更新序列列序列的必要权限?

最近我确实以超级用户的身份创建了一个表,其中包括一个序列号列,例如,

create table my_table
(
    id serial primary key,
    data integer
);
Run Code Online (Sandbox Code Playgroud)

因为我希望我的非超级用户用户拥有对该表的写访问权限,所以我授予了它权限:

grant select, update, insert, delete on table my_table to writer;
Run Code Online (Sandbox Code Playgroud)

在这样做之后的随机时间点,该用户所做的插入开始失败,因为该用户没有修改my_table_id_seq与串行列关联的序列的权限。不幸的是,我无法在我当前的数据库上重现它。

我通过授予用户所需的权限来解决这个问题,如下所示:

grant all on table my_table_id_seq to writer;
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解

  • 为什么,在某些时候,以前足够的权限可能会开始失败?
  • 为具有串行列的表授予写权限的正确方法是什么?

postgresql permissions sequence

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

调用函数,其中参数是(子)选择语句

我的函数接受一个int4作为参数并返回一个表:

SELECT * FROM test_function(545421); -- works fine

SELECT * FROM test_function(SELECT customerid
                            FROM tableX where id = 1); -- syntax error
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这项工作?
服务器 PostgreSQL 9.3.1

postgresql subquery set-returning-functions

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

如何使用数组作为 PostgreSQL 中 VARIADIC 函数的参数?

我正在尝试json_extract_path_text()使用citext模块制作不区分大小写的版本。

我希望这是一个围绕内置函数的简单包装器,唯一的区别是它接受citext作为第一个参数而不是json. 我希望这是对本机实现的直接传递,只需事先进行类型转换。这是我到目前为止所拥有的:

create extension citext;

create or replace function json_extract_path_text ( string citext, variadic params text[]) RETURNS text IMMUTABLE AS
$$
    BEGIN
        SELECT json_extract_path_text(string::json, params);
    END;
$$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

但是,由于类型不匹配,这不能正常工作:

ERROR:  function json_extract_path_text(json, text[]) does not exist
LINE 1: SELECT json_extract_path_text(string::json, params)
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:  SELECT json_extract_path_text(string::json, params)
CONTEXT:  PL/pgSQL function json_extract_path_text(citext,text[]) line 3 …
Run Code Online (Sandbox Code Playgroud)

postgresql parameter functions array case-sensitive

10
推荐指数
1
解决办法
6472
查看次数

PostgreSQL下如何指定触发器执行顺序?

我正在使用触发器使用“经典”基于时间的分区。我发现需要一个单独的触发器,它在原始表上运行。

CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();

CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Run Code Online (Sandbox Code Playgroud)

我还没有完全验证,但我怀疑分区逻辑在维护触发器之前运行,并且由于该行没有出现在父表中,因此第二个触发器永远不会触发。

如果我也想运行,会发生什么AFTER INSERT OR UPDATE?由于该行未将其放入原始表中,因此我无法实现 after 逻辑。

postgresql trigger

9
推荐指数
2
解决办法
9287
查看次数

部分数据库转储/恢复

我的数据库(PostgreSQL 9.3)的一部分依赖于额外的表(例如 County、City、Town...)。我不管理这些表,它们由第三方定期更新。每次我得到一个新的完整转储,但我很难将更改推回我的数据库。

我玩过 pg_dump / restore 并遇到了一些约束问题duplicate key value violates unique constraintcannot drop constraint ... because other objects depend on it甚至使用--disable-triggersor--clean选项。

有没有我错过的选项?我发现有一些方法可以打开/关闭约束,但我不知道这是解决这个问题的好方法还是只是一个肮脏的黑客?(我不是 DBA 专家。)老实说,我很惊讶没有简单的方法来实现这一目标。也许我已经错过了!我天真地认为我可以将 pg_restore 作为一个大事务运行并在脚本末尾检查约束。是否可以?

postgresql duplication restore

9
推荐指数
1
解决办法
4219
查看次数

为什么 SELECT 语句会在 Postgres 中脏缓存缓冲区?

EXPLAIN (ANALYZE, BUFFERS) SELECT ...在我的 Postgres 9.3 服务器上运行。我最终Buffers: shared hit=166416 dirtied=2在输出中看到了类似的东西。
从文档中,“脏”表示:

脏的块数表示此查询更改的先前未修改的块数;而写入的块数表示该后端在查询处理期间从缓存中逐出的先前脏块的数量。

这听起来像是将块标记为脏的过程应该只在更新数据时发生。SELECT但是,我的查询是,并且只读取数据。我想它只会报告点击或阅读。我显然错了。但是,在这种情况下到底发生了什么?

postgresql cache explain

9
推荐指数
1
解决办法
2133
查看次数