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