try 在PostgreSQL中创建条件唯一索引,但无法执行此操作并收到此错误
Query 1 ERROR: ERROR: cannot use subquery in index predicate
LINE 3: WHERE (
^
我的查询如下所示
CREATE UNIQUE INDEX conditional_unique_index
ON test_table (a, b)
WHERE (
SELECT COUNT(*)
FROM test_table t2
WHERE t2.a = test_table.a AND t2.b = test_table.b
) = 1;
我的要求是:
CREATE TABLE test_table (
a integer,
b integer,
c integer
);
INSERT INTO test_table (a, b, c) VALUES
(1, 2, 22),
(1, 2, 22),
(1, 2, 22),
(1, 3, 34),
(2, 3, 26),
(2, 3, 26);
条件是如果在列(a,b)中有多个具有相同值的行,则列c中的值必须如下所示:(1,2,22),(1,2,22),(1,2,22);而这是不允许的(1,2,22),(1,2,23),(1,2,22);c必须在这里相同(1,2,23)
现在第二个条件是,如果列(a,b)是唯一的,那么c也应该是唯一的 像这样(1,3,34),(2,3,26);这是不允许的(1,3,34),(2,3,34);在这种情况下不允许c相同的值
到目前为止,对于第一种情况,我已经通过使用触发器进行了处理
CREATE OR REPLACE FUNCTION check_conditional_unique() RETURNS TRIGGER AS $$
BEGIN
IF EXISTS (
SELECT 1
FROM test_table t2
WHERE t2.a = NEW.a AND t2.b = NEW.b AND t2.c <> NEW.c
) THEN
RAISE EXCEPTION 'Duplicate values in c for the same a and b combination.';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_check_conditional_unique
BEFORE INSERT ON test_table
FOR EACH ROW
EXECUTE FUNCTION check_conditional_unique();
但对于第二个 case ,我面临的问题这个酷儿是错误的,我为这个写的
CREATE UNIQUE INDEX conditional_unique_index
ON test_table (a, b)
WHERE (
SELECT COUNT(*)
FROM test_table t2
WHERE t2.a = test_table.a AND t2.b = test_table.b
) = 1;