小编Jim*_*nes的帖子

如何批量更新 postgres 中的单个列 5500 万条记录

我想更新 postgres 表的一列。记录大约有 5500 万条,因此我们需要批量更新 10000 条记录。注意:我们要更新所有行。但我们不想锁定我们的桌子。

我正在尝试以下查询 -

Update account set name = Some name where id between 1 and 10000
Run Code Online (Sandbox Code Playgroud)

我们如何为每 10000 条记录更新创建一个循环?

任何建议和帮助将不胜感激。

PostgreSQL 10.5

sql postgresql plpgsql

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

发生冲突的Postgres确实会更新复合主键

我有一张桌子,用户在其中回答问题。规则是用户可以回答许多问题,或者许多用户可以回答一个问题,但用户只能回答一次特定问题。如果用户再次回答该问题,则只需替换旧的问题即可。通常,当我们处理唯一列时,on冲突确实会更新。在这种情况下,列person_idquestion_id不能唯一。但是,两者的结合始终是唯一的。如何实现在冲突时会更新的插入语句?

CREATE TABLE "answer" (
  "person_id" integer NOT NULL REFERENCES person(id), 
  "question_id" integer NOT NULL REFERENCES question(id) ON DELETE CASCADE, /* INDEXED */
  "answer" character varying (1200) NULL,
  PRIMARY KEY (person_id, question_id) 
);
Run Code Online (Sandbox Code Playgroud)

sql postgresql upsert

7
推荐指数
2
解决办法
4973
查看次数

将 xml 模式导入 postgres 以自动创建表,然后用 xml 文件填充它?

我有一个巨大的 xml 文件,除非将其导入数据库,否则无法打开该文件。我为此使用 Postgres。我有一个与该数据文件配套的架构。列太多,因此我想自动执行从该架构创建表的过程,然后从计算机上的本地驱动器导入数据文件以填充该表。我该怎么做呢?我在SO上看到了很多答案,但一直无法正确理解这一点。另外,我没有超级用户权限,因此必须解决这个问题。

架构文件如下所示:

> <?xml version="1.0" encoding="UTF-8"?> <xs:schema
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> elementFormDefault="qualified"
>     targetNamespace="http://www.drugbank.ca" xmlns="http://www.drugbank.ca">
>     <xs:element name="drugbank" type="drugbank-type">
>         <xs:annotation>
>             <xs:documentation>This is the root element for the DrugBank database schema. DrugBank is a database on drug and
> drug-targets.</xs:documentation>
>         </xs:annotation>
>     </xs:element>
>     <xs:complexType name="drugbank-type">
>         <xs:annotation>
>             <xs:documentation>This is the root element type for the DrugBank database schema.</xs:documentation>
>         </xs:annotation>
>         <xs:sequence>
>             <xs:element name="drug" type="drug-type" maxOccurs="unbounded"/>
>         </xs:sequence>
>         <xs:attribute name="version" type="xs:string" use="required"> …
Run Code Online (Sandbox Code Playgroud)

java xml sql postgresql

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

如何在Postgresql中找到当前的max_parallel_workers值?

为了启用并行查询规划,Postgresql 有许多设置,例如max_parallel_workers等等。在 Postgresql 文档中提到了如何调整这些值,但是我们如何才能看到此类配置的当前值呢?

sql postgresql

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

如何通过键提取字段中的jsonb列

我正在使用 postgresql 和 postgis 插件。

我已经用这个方案存储了数据:table_id is primary key, properties is a jsonb and geom as geometry(GeometryZ,4326);

如果我提出此请求:select table_id, properties, geom from nametable返回所有信息,其中 table_id 作为整数,属性作为 jsonb,geom 作为几何(GeometryZ,4326)。

我想要一个查询,其中属性返回 table_id,列的列表,其中列的名称是值的键及其值和几何。例如,如果属性具有名称和密度,则返回如下响应:table_id | name | density | geom |,但我不知道属性的名称,因此我认为这应该是该查询中获取键名称的查询。

我最接近得到它的是这个查询:select jsonb_object_keys(properties) as key from nametable;

谢谢

编辑:

首先,我在 postgressql 数据库中存储了一个字段作为 jsonb,所以我想将该 jsonb 提取到列中。但已将包含不同属性的不同表存储到 jsonb 列中。

因此,我们的想法是获取一个查询,其中选择 table_id、属性(在多列中提取)和 geom。

1 - 有了这个我就有了键的名称:select jsonb_object_keys(properties) as key from nametable group by key;

2 - 通过键将每个键的所有值放入列中。

3 - 返回一个查询,当我调用它时,返回 …

sql postgresql postgis

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

Postgres - 使用 PostGis 在 LINQ 或 SQL 中进行地理空间搜索

我正在使用 PostGis 搜索给定范围内相对于给定原点的所有点。我正在查看 PostGis 提供的所有文档,但似乎无法弄清楚我将如何为此提出解决方案?

我的位置表如下所示:

Id         - INT(11)  
Longitude  - DOUBLE  
Latitude   - DOUBLE   
Address    - LONGTEXT  
City       - LONGTEXT   
Region     - LONGTEXT  
Country    - LONGTEXT
Run Code Online (Sandbox Code Playgroud)

输入将是Longitude,Latitude和 a Range(以公里或英里为单位)。

我希望收到Range.

sql linq postgresql postgis geospatial

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

如何连接表并以 JSON 形式返回?

我的 PostgreSQL 具有以下表结构:

CREATE TABLE "objs"("number" Integer,"name" Text NOT NULL,  "price" Text NOT NULL );
CREATE TABLE "users"("name" Text NOT NULL,"obj_number" Text NOT NULL );

INSERT INTO "objs" ("number","name","price") VALUES ( 1,'Small Red Apples','30' );
INSERT INTO "objs" ("number","name","price") VALUES ( 1,'Big Apples','50' );
INSERT INTO "objs" ("number","name","price") VALUES ( 2,'Small Bottle','24' );
INSERT INTO "objs" ("number","name","price") VALUES ( 2,'Big Bottle','60' );
INSERT INTO "objs" ("number","name","price") VALUES ( 1,'Small green Apples','45' );

INSERT INTO "users" ("name","obj_number") VALUES ( 'Mike','1' ); …
Run Code Online (Sandbox Code Playgroud)

sql postgresql json

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

Postgresql 不使用 CURRENT_USER 查询的索引

我有一个 Postgresql 表:

  CREATE TABLE IF NOT EXISTS acls1k (
    pkey serial PRIMARY KEY,
    user_name VARCHAR(50),
    tenant_id VARCHAR(36),
    CONSTRAINT user_name_unique1k UNIQUE (user_name)
  );
Run Code Online (Sandbox Code Playgroud)

uniqueuser_name 列上有一个索引。当我使用常量查询表时,索引用于查询:

explain analyze select * from acls1k where user_name = 'p1kuser1t1';
                                                         QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
 Index Scan using user_name_unique1k on acls1k  (cost=0.28..8.29 rows=1 width=53) (actual time=0.071..0.073 rows=1 loops=1)
   Index Cond: ((user_name)::text = 'p1kuser1t1'::text)
 Planning Time: 0.240 ms
 Execution Time: 0.094 ms
(4 rows)
Run Code Online (Sandbox Code Playgroud)

但是当我使用current_user变量时,会执行顺序扫描而不是索引扫描:

explain analyze select * from acls1k …
Run Code Online (Sandbox Code Playgroud)

sql postgresql query-optimization

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

将查询结果作为 CSV 文件从 Docker PostgreSQL 容器导出到本地计算机

我不确定这是否可能,或者我是否做错了什么,因为我对 Docker 还很陌生。基本上,我想将 PostgreSQL docker 容器内的查询结果作为 csv 文件导出到本地计算机。

这就是我到目前为止所得到的。首先,我使用以下命令运行 PostgreSQL docker 容器:

sudo docker run --rm --name pg-docker -e POSTGRES_PASSWORD=something -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres
Run Code Online (Sandbox Code Playgroud)

然后,我使用 docker exec 访问 docker 容器来运行 PostgreSQL 命令,该命令会将查询结果复制到具有指定位置的 csv 文件,如下所示:

\copy (select id,value from test) to 'test_1.csv' with csv;
Run Code Online (Sandbox Code Playgroud)

我认为应该将查询结果导出为本地计算机中名为 test_1.csv 的 csv 文件,但我在本地计算机中的任何位置都找不到该文件,还检查了这两个目录$HOME/docker/volumes/postgres/var/lib/postgresql/data postgres

sql csv postgresql psql docker

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

如何更正`docker exec psql`的终端大小?

docker exec -tiu postgres some_db_container psql db_name

这是一个方便的命令,可以连接到任何有权访问的docker容器,而无需发现应用程序用来连接的用户名和密码.

麻烦的是,此时分配的TTY是疯了.它不知道终端有多大,当它试图包裹线时它不会断线,如果你试图在中间编辑线,它就会完全脱离轨道.大多数情况下,在文本编辑器中编写查询并粘贴它更容易.

我想也许是因为在制作容器时没有分配TTY,但是tty: true在docker-compose中似乎没有效果.

我很惊讶我甚至在互联网上找不到这个问题的讨论,因为唯一的另一种连接方式是知道容器的IP和用户连接的凭据.

这有什么问题吗?每次我想调查一个问题时,我宁愿不必挖掘生产密码,如果我可以解决这个问题,我可以作为postgres用户连接.

docker docker-compose

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