我想更新 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
我有一张桌子,用户在其中回答问题。规则是用户可以回答许多问题,或者许多用户可以回答一个问题,但用户只能回答一次特定问题。如果用户再次回答该问题,则只需替换旧的问题即可。通常,当我们处理唯一列时,on冲突确实会更新。在这种情况下,列person_id和question_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) 我有一个巨大的 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) 为了启用并行查询规划,Postgresql 有许多设置,例如max_parallel_workers等等。在 Postgresql 文档中提到了如何调整这些值,但是我们如何才能看到此类配置的当前值呢?
我正在使用 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 - 返回一个查询,当我调用它时,返回 …
我正在使用 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.
我的 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) 我有一个 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) 我不确定这是否可能,或者我是否做错了什么,因为我对 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
docker exec -tiu postgres some_db_container psql db_name
这是一个方便的命令,可以连接到任何有权访问的docker容器,而无需发现应用程序用来连接的用户名和密码.
麻烦的是,此时分配的TTY是疯了.它不知道终端有多大,当它试图包裹线时它不会断线,如果你试图在中间编辑线,它就会完全脱离轨道.大多数情况下,在文本编辑器中编写查询并粘贴它更容易.
我想也许是因为在制作容器时没有分配TTY,但是tty: true在docker-compose中似乎没有效果.
我很惊讶我甚至在互联网上找不到这个问题的讨论,因为唯一的另一种连接方式是知道容器的IP和用户连接的凭据.
这有什么问题吗?每次我想调查一个问题时,我宁愿不必挖掘生产密码,如果我可以解决这个问题,我可以作为postgres用户连接.