【问题标题】:cannot update table Temp Table because it does not have a replica identity and publishes updates in Postgres无法更新表临时表,因为它没有副本标识并在 Postgres 中发布更新
【发布时间】:2019-05-06 07:35:40
【问题描述】:

我使用带有复制功能的 Postgres 数据库。
我在 postgres 函数中使用了临时表。通过加入更新临时表时,我无法更新它。

下面是 Postgres 查询(tempallergyupdates 是临时表):

 drop table if exists tempallergyupdates;
 create temp table tempallergyupdates(patientallergyid int,updateid int, newupdateid int);
 update tempallergyupdates set patientallergyid = 1;

以上查询抛出以下异常:

无法更新表“tempallergyupdates”,因为它没有 复制身份并发布更新

【问题讨论】:

    标签: database postgresql database-replication


    【解决方案1】:

    我们刚刚遇到这个问题并找到了解决方案。事实证明,PostgreSQL 不喜欢缺少涉及复制的主键的表,甚至是临时表。所以要么在你的临时表中添加一个,要么在创建表后使用这样的语句:

    ALTER TABLE table_name REPLICA IDENTITY FULL;
    

    【讨论】:

      【解决方案2】:

      REPLICA IDENTITY FULL适用于字段中的标准数据类型。

      ALTER TABLE table_name REPLICA IDENTITY FULL;
      

      但是,当出现 json 字段时,您会看到如下消息:

      错误:无法识别 json 类型的相等运算符 后台工作者逻辑复制工作者以退出代码 1 退出

      在这种情况下,你必须添加一个新的唯一索引,可能是添加一个序列列或者只是跳过 json 字段或者添加一个新的 PK 等。

      告诉副本进程使用这个索引。

      /* id is a new serial column */
      create unique index concurrently idx_someid on tablename (id); 
      
      alter table tablename REPLICA IDENTITY  USING INDEX concurrently; 
      
                                                                                                                                 
      

      【讨论】:

        猜你喜欢
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多