唯一索引 - col1或col2中的唯一值

时间:2015-01-28 09:54:23

标签: postgresql postgresql-9.4

我在表tab中有两列:col1col2。我希望以如下方式使它们成为唯一:如果X中插入了值col1,那么col1col2中的任何行都不应该存在col1反之亦然)。所以实际上我想将col2和{{1}}都视为同一列(根据唯一性)。这似乎很简单,但我无法弄清楚如何设置正确的索引......

1 个答案:

答案 0 :(得分: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();