1

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

我有一个提供正常 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    |
4

1 回答 1

3

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

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

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

您还可以更改表以添加唯一约束,但没有太大区别。

于 2012-11-28T21:12:47.137 回答