标签: postgresql

2 INSERT 语句是否保证按顺序完成?

我们有一个从客户端接收事件并将它们存储在数据库中的系统。

每个事件都保存为一个 atomic INSERT,并且有id_event一个自动递增的主键。

我们的客户可以执行一个特定的动作,导致 2 个事件被快速连续触发:

  • 1) name: 'board-added', boardId: 12344
  • 2) name: 'board-switched', boardId: 12344

两个事件都以正确的顺序到达我们的服务器。

但是,出于某种原因,我们不断发现某些board-switched事件id_event在其对应board-added事件之前具有。

正如你可以在下面的一组结果看,board-added具有较高的id_eventboard-switched这是错误的。

{name: "board-switched", boardId: 313994, id_event: 48041136} {name: "board-added", boardId: 313994, id_event: 48041137}

我的问题是:

是否有可能INSERT顺序执行的2 个事件会导致第2 个事件在第一个事件INSERT之前完成INSERT

postgresql

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

哪个更新数千个表行更快?

使用PostgreSQL v10.1.2 中的存储过程,哪种方法最快或哪种更好:检查行是否存在然后更新或尝试直接更新,但可能找不到与条件匹配的行?我需要检查很多条件相同的表,表是不是“非规范化”,我进行了几次测试,有时选项 1在其他情况下更快,选项 2 ...

选项1:

IF EXISTS ( SELECT  1
FROM   public.table1 
WHERE  column1 = 'oldvalue' )
THEN
   UPDATE public.table1
   SET   column1 = 'newvalue' , date_update= .... 
   WHERE  column1 = 'oldvalue';
END IF ;
Run Code Online (Sandbox Code Playgroud)

选项 2:

UPDATE public.table1
SET   column1 = 'newvalue' , date_update= ... 
WHERE  column1 = 'oldvalue';
Run Code Online (Sandbox Code Playgroud)

选项 3:

perform FROM   public.table1 WHERE  column1 = 'oldvalue' ;
if found then 
   UPDATE public.table1 SET column1='newvalue', date_update = ... WHERE column1 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance stored-procedures update postgresql-10

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

如何在一个查询中对 postgresql 数据库执行多次插入

我有一个订单、收件人和项目表。

我想根据上一个查询的响应将数据插入到每个表中。

insert into recipient(name, address) values(name, address);
insert into orders(recipient_id, total_price, total_quantity) values(recipient_id, 2000, 20);
insert into items(order_id, item, price, quantity, total) values(order_id, item1, 230, 2, 260);
insert into items(order_id, item, price, quantity, total) values(order_id, item2, 500, 2, 1000);
Run Code Online (Sandbox Code Playgroud)

我想在单个 PostgreSQL 查询中执行此操作。

这是我尝试过的

insert into users (fullname, email, phone, address, status)
  values ('Mine Essien', 'davidessienshare@gmail.com', '08167462431', 'Andela Epic tower Lagos')
  returning id as recipient_id
)

new_order AS(
  insert into orders(user_id, recipient_id, quantity, total_cost)
  values(1, recipient_id, 5, 9500)
  returning id …
Run Code Online (Sandbox Code Playgroud)

postgresql insert

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

如何通过 psql 关闭 postgres?

推荐的关闭方式postgres是发送一个代表不同关闭模式(快速、智能、立即)的信号,或者在非 Linux 操作系统上使用初始化管理器(initdsystemd、 等)或它们的等效方法。在集装箱环境中它有时更方便,通过以获得psqldocker exec,从而更方便的通过停止服务器psql。有没有办法做到这一点(假设已授予特权)?

该解决方案可能很棘手,因为这主要用于postgres在开发环境中停止删除 PostgreSQL 数据目录。

postgresql psql shutdown

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

为什么从 PL/pqSQL 函数调用时 \COPY 不起作用?

我正在尝试使用该\COPY函数从客户端的文本文件填充数据库。我正在使用Postgres 交互式终端(psql) 来执行此任务。

我编写了以下脚本并将其保存到test.sql

CREATE FUNCTION copy_stuff_to_db(path text, encoding text) RETURNS void
AS $$
BEGIN
    \COPY table1 FROM path || 'table1.asc' WITH ENCODING encoding;
END;
$$ LANGUAGE plpgsql;

PERFORM copy_stuff_to_db('/home/martin', 'ISO 8859-1')
Run Code Online (Sandbox Code Playgroud)

我是这样执行的:

psql --port 5432 --host localhost -d mydb --username postgres -f test.sql 
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

psql:test.sql:12: ERROR:  syntax error at or near "\" 
LINE 4: \COPY table1 FROM path || 'table1.asc' WITH DE...
        ^
Run Code Online (Sandbox Code Playgroud)

起初我认为终端不执行 PL/pgSQL,我将不得不放置我的文件并运行脚本服务器端。但是,当我直接调用该函数时(即我将之前的脚本修改为):

\COPY table1 FROM '/home/martin/table1.asc' WITH ENCODING 'ISO 8859-1'; …
Run Code Online (Sandbox Code Playgroud)

postgresql psql

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

为 ARRAY[] 列的默认值选择 NULL 与空数组 {} 时是否会影响磁盘空间?

我的直觉是NULL将比{}用作ARRAY[]PostgreSQL 中列的默认值时占用的空间更少。

我对么?

postgresql storage

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

什么是“对象”?

Postgres 文档经常使用术语“对象”。例如,https://www.postgresql.org/docs/current/app-psql.html 上的各种\d命令的描述(例如用于列出表或用于列出聚合函数)使用如下短语:\dt\da

默认情况下,只显示用户创建的对象;提供模式或S修饰符以包含系统对象。

由此,我可以推断出,至少每个命令列出的特定内容——比如聚合函数、表、字符集编码、模式和一大堆其他东西——是 Postgres 命名法中的“对象”。考虑到在它们的描述中避免使用“对象”这个词,我还可以合理地猜测一些可以用\d命令列出的东西,比如角色,不是对象。

但这究竟是什么意思?目前我无法判断任何特定的东西(如表格行、表格列或角色)是否被正确地视为“对象”,除非发生在 Postgres 文档中的某个位置如此称呼。文档使用的基本定义是什么?

postgresql terminology

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

pg_xlog 发生了什么?

是否有一个名为pg_xlog将所有 WAL 日志存储在 PostgreSQL 中的目录?在归档方案下恢复基本备份的一部分需要我将 WAL 复制到DATA_DIR/pg_xlog. 这个目录怎么了?

postgresql replication write-ahead-logging postgresql-10

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

错误:无效的 GeoJson 表示

GeoJSON 规范展示,

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
  },
  "properties": {
    "name": "Dinagat Islands"
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当我把它包装在一个调用中时ST_GeomFromGeoJSON,像这样,

SELECT ST_GeomFromGeoJSON($${                                                                                                                          
  "type": "Feature",                                                                                                                                   
  "geometry": {                                                                                                                                        
    "type": "Point",                                                                                                                                   
    "coordinates": [125.6, 10.1]                                                                                                                       
  },                                                                                                                                                   
  "properties": {                                                                                                                                      
    "name": "Dinagat Islands"                                                                                                                          
  }                                                                                                                                                    
}$$);
Run Code Online (Sandbox Code Playgroud)

我得到错误,

错误:无效的 GeoJson 表示

postgresql spatial postgis json geojson

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

在 Postgres 触发器的 FROM 子句中使用 NEW?

我正在尝试编写 Postgres 触发器以在插入或更新新行之前取消嵌套数组字段。例如

SELECT
unnest(something)
FROM NEW
Run Code Online (Sandbox Code Playgroud)

但是,这似乎会导致错误:

关系“新”不存在

如何使用触发器函数内的 NEW 行,以允许我取消嵌套数组字段以进行进一步处理?

创建表语句

以下是表结构的示例:

CREATE TABLE parent_table (
    id uuid NOT NULL,
    jsonb_array_field jsonb[] NOT NULL DEFAULT '{}'::jsonb[],
    CONSTRAINT "parent_table_pkey" PRIMARY KEY (id),
);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE many_to_one_table (
  id serial primary key,
  parent_table_id uuid references parent_table(id),
  subfield_a text,
  subfield_a text
);
Run Code Online (Sandbox Code Playgroud)

触发功能

下面是 TRIGGER 函数的本质:

CREATE OR REPLACE FUNCTION unnest_and_normalize_json() RETURNS TRIGGER AS 
$body$
begin
    if NEW.jsonb_array_field is null then
        raise exception 'jsonb_array_field is null';
    else
        insert into 
            many_to_one_table(subfield_a, subfield_b) …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger subquery postgresql-9.4

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