我正在努力处理随机返回多行而不是一行的查询。我正在使用 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是主键。
它是通过一系列集成测试执行的。当我只执行上述查询的测试时,我没有任何问题。但是,当我执行所有测试时,我随机得到多行。你有什么建议吗?
我正在尝试以一种可重现的方式用一些测试数据填充数据库。
假设(一个过于简化的示例)三个基表: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 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) 在我的计算机从 Mac Sierra 升级到 High Sierra 后,我的 psql 开始表现出令人讨厌的行为。有时当它列出行时,它会打印 (END) 而不是提示,我必须按任何按钮才能停止退出显示并获得提示。并非每次查询都会发生这种情况,但很难预测它何时发生。有时它会在 2 行之后放置一个 (END),而不是在 15 行之后。
什么控制了 psql 的这些方面,我该如何控制和关闭它?很烦人的是,我为我运行的每个查询都按下了一个键,或者它吞下了第一个字符并让我写了“elect * from”。
附加输入
当行的显示比终端窗口宽时,它似乎会触发 - 即它流过多行。我使用 Mac 的普通内置终端应用程序。
这个问题是关于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 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) 我在 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) 我在另一个论坛上遇到了这个:
PG 对于
IN查询中的值的限制为 100,之后不使用所述列上的索引。例如:SELECT ... WHERE IN (...)如果 IN 列表超过 100,则对 PK的典型查询将变成全表扫描。
我无法找到任何关于此的信息。PG 有没有这样的限制(我是这么想的),如果有,这个限制是多少?
我知道有时在临时表中使用大型子选择会更好,但是了解截止位置会很有帮助。
postgresql performance index execution-plan postgresql-performance
这是示例:
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 10 脚本,我想在开始时为其声明一次变量,然后在整个脚本中使用它们(带有可能的事务)。
我知道我可以做到:
DO $$
DECLARE test float := 0.1 ;
BEGIN
< do whatever here>
END $$
Run Code Online (Sandbox Code Playgroud)
但这使我每次有 BEGIN / END 块时都声明变量。
postgresql ×10
concurrency ×1
count ×1
cte ×1
index ×1
insert ×1
mac-os-x ×1
performance ×1
psql ×1
subquery ×1
update ×1