0

我在表中有两列tabcol1col2。我希望以这样的方式使它们独一无二,如果值X被插入,col1那么它不应该出现在任何行中,无论是 incol1还是 in col2(反之亦然)。所以实际上我想将两者都col1视为col2同一列(根据唯一性)。这似乎很简单,但我不知道如何设置正确的索引...

4

1 回答 1

1

您可以使用规则或触发器。为方便起见,您首先需要一个简单的函数来检查值是否已存在:

CREATE OR REPLACE FUNCTION check_value_exists(val ANYELEMENT) returns boolean as $$
select val IN  (select col1 from tab union select col2 from tab) 
$$
LANGUAGE sql;

一个规则可能是这样的:

create or replace rule check_uniqueness as on insert to tab where (check_value_exists(NEW.col1) OR check_value_exists(NEW.col2)) DO INSTEAD NOTHING;

现在,如果您尝试插入一个已经存在的值,则不会插入任何内容(DO INSTEAD NOTHING)。

如果你想更好地处理已经存在值的情况(即引发异常或警告或其他东西),你可能最好使用触发器(更多代码但更强大):

CREATE OR REPLACE FUNCTION check_uniqueness() RETURNS TRIGGER AS $$
BEGIN
  IF (check_value_exists(NEW.col1) OR check_value_exists(NEW.col2)) THEN
     RAISE EXCEPTION 'Value % or % already exists',NEW.col1,NEW.col2;
  END IF;
  return NEW;
  END;
$$LANGUAGE  plpgsql;


CREATE TRIGGER check_uniqueness_trigger BEFORE INSERT ON tab FOR EACH ROW EXECUTE PROCEDURE check_uniqueness();
于 2015-01-28T12:25:54.327 回答