标签: postgresql-10

一组 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
查看次数

为整个脚本声明变量

我有一个 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
查看次数

在重新索引时避免表锁定

我们使用的是 PostgreSQL 10,我们需要重新索引表以重新组织数据和可用空间。

我们遇到的问题是此操作锁定了我们需要始终保持可用的表。

我们找到了一个解决方法,但这似乎比标准释放的空间少得多reindex,所以我们将其关闭。

是否有一些解决方案可以让我们重新索引,并使表格始终可用?

postgresql postgresql-10

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

如何从 Postgres 系统目录中识别用于对表进行分区的列

鉴于这样创建的表......

CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);
Run Code Online (Sandbox Code Playgroud)

如何确定它被分区在哪一列上?- 在本例中,仅通过查询 postgres 目录来获取“logdate”。

我查看了目录中明显的位置(pg_class、pg_index),但没有任何结果。

(使用10.5版本)

postgresql partitioning postgresql-10

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

将引号放在整数列的 WHERE 子句中有什么后果?

我有一个包含some_column数据类型列的表integer
我注意到我的 PostgreSQL 10.6 实例足够智能,可以将以下两个查询解释为相同:

select * from my_table where some_column = 5; -- no quotes

select * from my_table where some_column = '5'; -- quotes added
Run Code Online (Sandbox Code Playgroud)

在列的where子句中添加引号有什么影响integer
它会对一个包含 2000 万行的大表产生性能影响吗?
(有一个索引some_column。)

postgresql performance syntax postgresql-10 query-performance

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

仅当 PostgreSQL 中不存在表时,如何创建表?

这是在PostgreSQL中创建新表的方法,

CREATE TABLE foo (
    foo_id  int   PRIMARY KEY,
    bar     text,
);
Run Code Online (Sandbox Code Playgroud)

如果需要检查该表是否已存在并CREATE仅在未找到时继续处理,我该如何执行此操作?

postgresql table postgresql-10

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