postgresql - 如何将复杂类型数组的成员与 SELECT 进行比较?

标签 postgresql postgresql-9.6

给定一个这样的表:

╔══════════════════════════════════════╤════════╤═══════════╗
║ message_id                           │ type   │ json_data ║
╠══════════════════════════════════════╪════════╪═══════════╣
║ 2c8c86b7-4867-494a-88bf-1e6b17dd121f │ type-a │ {}        ║
╟──────────────────────────────────────┼────────┼───────────╢
║ 767d6fbf-84cf-4baa-9e33-46b15f0c8594 │ type-b │ {}        ║
╟──────────────────────────────────────┼────────┼───────────╢
║ 298dcedb-b51d-4623-89f8-fabec44663c8 │ type-c │ {}        ║
╚══════════════════════════════════════╧════════╧═══════════╝

和如下类型:

CREATE TYPE public.new_stream_message AS (
  message_id    UUID,
  "type"        VARCHAR(128),
  json_data     VARCHAR,
  json_metadata VARCHAR
);

以及一个将这些数组作为参数之一的函数。

在这个函数中,我将这个数组写到一个表中。如果存在唯一约束冲突,我想将数组中的 message_id 与该表中的 select 语句进行比较。如果一切都匹配,那么这是一次幂等写入,我可以安全地忽略异常。我该怎么做?

最佳答案

怎么样

CREATE OR REPLACE FUNCTION idempotentAppend(streamId varchar, new_stream_message NewMessage[]) RETURNS AppendResult AS $$
DECLARE
    ...
BEGIN

    ...

    foreach message in ARRAY newMessages
    loop
        BEGIN
          INSERT INTO public.Messages (message_id, Type, JsonData, json_metadata)
          SELECT message.*;
        EXCEPTION WHEN unique_violation THEN
            SELECT * FROM public.Messages into conflict WHERE public.Messages.Id = Id;
            IF message.type != conflict.type OR message.json_data != conflict.json_data THEN
                RAISE unique_violation USING MESSAGE = 'Duplicate message ID: ' || Id;
            END IF;
        END;
    end loop;

    ...

END;
$$ LANGUAGE plpgsql;

顺便说一句,我在 ddd-cqrs-es slack 的#sql-stream-store channel 中找到了它,并且一直在慢慢开发 java 版本。

编辑:Whelp...看来我应该阅读更多 slack channel 。看起来你已经解决了它

关于postgresql - 如何将复杂类型数组的成员与 SELECT 进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49530471/

相关文章:

performance - Postgresql 数组 && 运算符执行速度低于预期

postgresql - 如何在一对多关系中复制另一个表的外键

python - 使用 SQLAlchemy 将行从一个表批量移动到另一个表

sql - 使用 Sequelize 从另一个表中丢失的 postgresql 表中获取数据

postgresql - go-pg - 读取更新后返回的 ID

sql - postgresql:offset + limit 变得非常慢

sql - 函数 oracle 到 postgresql

sql - 根据列 id(顺序)将所选数据合并到同一行

postgresql - Npgsql.PostgresException (0x80004005) : XX000: cache lookup failed for type 207852 when schema dropped

postgresql - JSONB 索引是否比原生索引慢?