我在表tab
中有两列:col1
和col2
。我希望以如下方式使它们成为唯一:如果X
中插入了值col1
,那么col1
和col2
中的任何行都不应该存在col1
反之亦然)。所以实际上我想将col2
和{{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();