【问题标题】:Postgresql Insertion rule/triggerPostgresql 插入规则/触发器
【发布时间】:2015-11-17 21:16:41
【问题描述】:

我在为 postgresql 中的表 [t_1] 创建插入规则或触发器时遇到问题

表格有四列:c1, c2, c3, c4, id(unique) 当一条新记录尝试插入到表中时,有以下规则:

  1. 如果 id 不重复,则使用 NEW 记录进行正常插入
  2. 如果 id 存在:则检查 c1,c2,c3 和 NEW.c1, NEW.c2, NEW.c3;如果 c1 或 c2 或 c3 不为空,则更新记录,不要用新记录覆盖旧记录。

例如

c1(非空),c2(空),c3(非空),c4(空)

+

nC1(非空),nC2(非空),nC3(空),nC4(空)

结果

c1、nC2、c3、c4

  1. 如果 id 存在:如果新 c4 不为空,则检查旧 c1、c2、c3,如果旧 c1、c2、c3 中的任何一个不为空,则不做任何事情(不要插入或更新)

这是我目前的代码:(仍然没有第三种情况的解决方案)

  CREATE RULE "t_1_on_duplicate_ignore" AS ON INSERT TO "t_1"
  WHERE EXISTS(SELECT 1 FROM t_1
    WHERE (id)=(NEW.id)
DO INSTEAD
(
  UPDATE t_1 SET
    c1 = CASE 
    WHEN c1 IS NOT NULL
    THEN c1
    ELSE NEW.c1  
    END,
    c2 = CASE 
    WHEN c2 IS NOT NULL
    THEN c2
    ELSE NEW.c2
    END,
    c3 = CASE 
    WHEN c3 IS NOT NULL
    THEN c3
    ELSE NEW.c3
    END
  WHERE id = NEW.id;
)

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    大家好,我想我用以下命令解决了这个问题(至少它对我有用):

          CREATE RULE "t_1_on_duplicate_ignore" AS ON INSERT TO "t_1"
          WHERE EXISTS(SELECT 1 FROM t_1
            WHERE (id)=(NEW.id))
        DO INSTEAD
        (
            UPDATE t_1 SET
                c1 = CASE
                WHEN (c1 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND c1 IS NOT NULL) OR (c4 IS NULL AND NEW.c4 IS NOT NULL)
                THEN c1
                ELSE NEW.c1
                END,
                c2 = CASE
                WHEN (c2 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND c2 IS NOT NULL) OR (c4 IS NULL AND NEW.c4 IS NOT NULL)
                THEN c2
                ELSE NEW.c2
                END,
                c3 = CASE
                WHEN (c3 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND c3 IS NOT NULL) OR (c4 IS NULL AND NEW.c4 IS NOT NULL)
                THEN c3
                ELSE NEW.c3
                END,
                c4 = c4
            WHERE id = NEW.id;
        )
    

    有更好的解决方案吗?

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      相关资源
      最近更新 更多