标签: postgresql

带有子查询 LIMIT 1 的 UPDATE 返回多行

我正在努力处理随机返回多行而不是一行的查询。我正在使用 PostgreSQL 9.4.12

查询如下:

UPDATE folder as f set locked = 'locked', date_locked = current_timestamp 
from (
    SELECT * from folder as f2 
    WHERE f2.locked = 'available'
    LIMIT 1 FOR UPDATE ) as folderToUpdate 
WHERE f.id = folderToUpdate.id returning f.*
Run Code Online (Sandbox Code Playgroud)

id是主键。

它是通过一系列集成测试执行的。当我只执行上述查询的测试时,我没有任何问题。但是,当我执行所有测试时,我随机得到多行。你有什么建议吗?

postgresql concurrency update postgresql-9.4

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

一组 with 后的多个插入查询

我正在尝试以一种可重现的方式用一些测试数据填充数据库。

假设(一个过于简化的示例)三个基表:name、city、job 和两个关系表:name-city 和 name-job。我需要在三个基表中的每一个中创建一个条目,并使用上述条目在两个关系表中创建条目。

我已经拥有了一种使用一系列with查询在 3 个基表中创建条目并将值插入到一个关系表中的方法。

with x as 
(INSERT INTO "public"."name" VALUES(DEFAULT) RETURNING "id"),
y as 
(INSERT INTO "public"."job" VALUES(DEFAULT) RETURNING "id"),
z as 
(INSERT INTO "public"."city" VALUES(DEFAULT) RETURNING "id")

INSERT INTO "public"."name-job"("name", "job")  
select x.id, y.id from x,y;
Run Code Online (Sandbox Code Playgroud)

我真的想添加第二个插入语句

INSERT INTO "public"."name-city"("name", "city")  
select x.id, z.id from x,z;
Run Code Online (Sandbox Code Playgroud)

第一次插入后,但不知道如何。我曾尝试用逗号分隔两个插入语句,并将它们括在括号中,然后用逗号分隔它们,以及其他一些方法,但没有任何效果。

使用带有第二个插入的全新语句并不完全是一种选择,因为我需要使用相同的 x、y、z 值。鉴于我缺乏专业知识/经验,我完全有可能遗漏了一些明显的东西......所以任何关于我如何做到这一点的想法,理想情况下,没有高度复杂的工具,将是最受欢迎的。

FWIW,我正在使用 Postgres (10.x)

postgresql insert subquery postgresql-10

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

同一列上的多个 COUNT

我有一个表 (PostgreSQL 9.6),其中包含 260 万多个与帐户标识符关联的带时间戳的行,对于任何给定的标识符,我想计算在单个查询中出现总次数以及今天的出现次数

作为参考,这与此问题中描述的表相同,但我在此处对其进行了简化以关注此特定问题:

CREATE TABLE account_test
(
  id integer NOT NULL PRIMARY KEY
);

CREATE TABLE log_test
(
  account integer NOT NULL REFERENCES account_test(id),
  event_time timestamp with time zone NOT NULL DEFAULT now()
);

CREATE INDEX account_test_idx ON log_test USING btree (account,event_time);

INSERT INTO account_test VALUES (1);
INSERT INTO account_test VALUES (2);

INSERT INTO log_test VALUES (1,'2018-01-01');
INSERT INTO log_test VALUES (1,'2018-01-02');
INSERT INTO log_test VALUES (1,'2018-01-03');
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

postgresql count postgresql-9.6

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

如何使用(END)控制psql显示行?

在我的计算机从 Mac Sierra 升级到 High Sierra 后,我的 psql 开始表现出令人讨厌的行为。有时当它列出行时,它会打印 (END) 而不是提示,我必须按任何按钮才能停止退出显示并获得提示。并非每次查询都会发生这种情况,但很难预测它何时发生。有时它会在 2 行之后放置一个 (END),而不是在 15 行之后。

什么控制了 psql 的这些方面,我该如何控制和关闭它?很烦人的是,我为我运行的每个查询都按下了一个键,或者它吞下了第一个字符并让我写了“elect * from”。

附加输入

当行的显示比终端窗口宽时,它似乎会触发 - 即它流过多行。我使用 Mac 的普通内置终端应用程序。

postgresql psql mac-os-x

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

PostgreSQL - 不同月份的最大总和与多年的关系

这个问题是关于MySQL 5.6这里的一个问题的PostgreSQL 版本。最初,这是两个 RDBMS 的一个问题,但有人建议我,鉴于两个系统的不同功能,我应该拆分问题 - 特别是我认为 CTE(WITH 子句)应该使查询更加优雅和可读!

假设我有一个肿瘤列表(这个数据是根据真实数据模拟的):

CREATE table illness (nature_of_illness VARCHAR(25), created_at DATETIME);

INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Lung',   '2018-01-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung', …
Run Code Online (Sandbox Code Playgroud)

postgresql cte greatest-n-per-group

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

防止列在记录中具有相同的值

我正在使用 PostgreSQL 10。我想要一个表,允许在列中使用相同的值,但不允许在行中使用。我创建的表:

CREATE TABLE teams
(
  team_id SERIAL PRIMARY KEY
  team_lead character varying(250) NOT NULL,  
  member1 character varying(250) NOT NULL,
  member2 character varying(250),
  member3 character varying(250)
  )
Run Code Online (Sandbox Code Playgroud)

这将被允许:

CREATE TABLE teams
(
  team_id SERIAL PRIMARY KEY
  team_lead character varying(250) NOT NULL,  
  member1 character varying(250) NOT NULL,
  member2 character varying(250),
  member3 character varying(250)
  )
Run Code Online (Sandbox Code Playgroud)

这不会:

| team_lead     |  member1     | member2       |
------------------------------------------------
| Jane Doe      | Bill Smith   | Shirley Green |
| Jane Doe      | Carol Lewis  | …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design

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

选择列值出现多次的所有行

我在 Postgres 中有以下表结构:

 id | account_id | plan_id | active
----+------------+---------+--------
  1 |    0cYd7Ak |       1 |      f
  2 |    Uk02q1d |       1 |      t
  3 |    eRlk810 |       2 |      f
  4 |    Uk02q1d |       2 |      t
  5 |    0cYd7Ak |       1 |      t
  6 |    yT3nv3p |       3 |      t  
Run Code Online (Sandbox Code Playgroud)

如何选择account_id出现多次的所有行?对于上面的示例,它将返回第 1、2、4、5 行

我试过这个查询,但它没有返回我所期望的:

select * from table_name t1 
where (select count(*) from table_name t2 
  where t1.account_id = t2.account_id) > 1 
order by t1.account_id;
Run Code Online (Sandbox Code Playgroud)

postgresql

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

Postgres 绕过带有 100 多个值的 IN 子句的索引?

在另一个论坛上遇到了这个:

PG 对于IN查询中的值的限制为 100,之后不使用所述列上的索引。例如:SELECT ... WHERE IN (...)如果 IN 列表超过 100,则对 PK的典型查询将变成全表扫描。

我无法找到任何关于此的信息。PG 有没有这样的限制(我是这么想的),如果有,这个限制是多少?

我知道有时在临时表中使用大型子选择会更好,但是了解截止位置会很有帮助。

postgresql performance index execution-plan postgresql-performance

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

带有 order by 的窗口函数返回奇怪的结果

这是示例:

drop table if exists tst;

create table tst (
num integer not null
);

insert into tst values (1), (2), (3);

-- window functions WITH order by clause
select *, max(num) over (partition by true order by num asc), array_agg(num) over (partition by true order by num asc) as test
from tst;

-- window functions WITHOUT order by clause
select *, max(num) over (partition by true), array_agg(num) over (partition by true) as test
from tst;
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此处输入图片说明

为什么order by子句对聚合功能有影响?

postgresql window-functions

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

为整个脚本声明变量

我有一个 PostgreSQL 10 脚本,我想在开始时为其声明一次变量,然后在整个脚本中使用它们(带有可能的事务)。

我知道我可以做到:

DO $$
DECLARE test float := 0.1 ;
BEGIN
    < do whatever here>
END $$
Run Code Online (Sandbox Code Playgroud)

但这使我每次有 BEGIN / END 块时都声明变量。

postgresql postgresql-10

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