【问题标题】:UPDATE OR INSERT function when uniqueness is determined by the combination of two columns唯一性由两列的组合确定时的 UPDATE OR INSERT 函数
【发布时间】:2012-11-28 21:07:11
【问题描述】:

扩展通常的插入或更新难题

我有一个提供普通 UPDATE 或 INSERT 的函数,它看起来像这样:

CREATE OR REPLACE FUNCTION updateslave ( varchar(7), smallint ) RETURNS void AS
$$
 BEGIN
   LOOP
     UPDATE consist SET
       master = $1,
       time = now() WHERE slave = $2;
     IF found THEN
       RETURN;
     END IF;
     BEGIN
       INSERT INTO consist(master, slave, time) VALUES ( $1, $2, now() );
       RETURN;
     EXCEPTION WHEN unique_violation THEN
       -- do nothing, then loop and retry
     END;
   END LOOP;
 END;
##
LANGUAGE plpgsql;

现在,问题是我正在尝试重写它以在不同的表中进行类似的操作。但是,不同的是,在另一个表中,没有单一的唯一列,而是两列的组合只存在于一行中。是否可以改为基于两列的组合来声明 unique_violation?

为了简单起见,我们假设该表看起来与我使用上述函数的表完全相同,但主从是两个共同产生唯一性的列:

 Column |            Type             |                  Modifiers                   | Storage  | Description
--------+-----------------------------+----------------------------------------------+----------+-------------
 master | character varying(7)        | not null default 'unused'::character varying | extended |
 slave  | smallint                    | not null                                     | plain    |
 time   | timestamp without time zone | default now()                                | plain    |

【问题讨论】:

    标签: sql postgresql stored-procedures


    【解决方案1】:

    最好的方法是在表上定义一个唯一的约束,这样无论更新如何发生,即如果你的 proc 被使用与否,一切正常。

    最简单的方法是在两列上创建唯一索引:

    create unique index any_mame on mytable(col1, col2);
    

    您也可以更改表以添加唯一约束,但差别不大。

    【讨论】:

    • 换句话说,如果创建了唯一约束,在这种情况下它会抛出一个unique_violation,因此我可以使用基本相同的功能吗? (显然改变了表名和列名)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2012-05-17
    • 1970-01-01
    相关资源
    最近更新 更多