检查 (table1.integer >= table2.integer)

CHECK (table1.integer >= table2.integer)

我需要创建一个 CHECK 约束来验证在一个列中输入的整数是否大于或等于另一个 table 中另一列中的整数。

例如,以下 table 是有效的:

=# SELECT * FROM table1;
 current_project_number
------------------------
                     12

=# SELECT * FROM table2;
 project_name | project_number
--------------+----------------
 Schaf        |              1
 Hase         |              8
 Hai          |             12

并且以下 table 无效:

=# SELECT * FROM table1;
 current_project_number
------------------------
                     12

=# SELECT * FROM table2;
 project_name | project_number
--------------+----------------
 Schaf        |              1
 Hase         |              8
 Hai          |             12
 Erdmännchen  |             71    <-error:table1.current_project_number is NOT >= 71

请注意,此 CHECK 约束旨在确保无法插入上述信息。我不是在寻找 SELECT 值 current_project_number >= project_number,这是关于 INSERTing

我需要什么才能让这样的 CHECK 发挥作用?谢谢

定义引用另一个 table 的 CHECK 约束是可能的,但这是一个非常糟糕的想法,将来会导致问题。

CHECK 约束仅在修改了带有约束的 table 时才生效, 不是 当另一个 table 被引用时约束被修改。因此,可以通过在那一秒的修改使条件无效 table.

换句话说,PostgreSQL 不保证约束总是有效的。这可能而且将会导致令人不快的意外,例如使用 pg_dump 进行的备份无法再恢复。

不要走那条路。

如果您需要这样的功能,请在 table1 上定义一个 BEFORE INSERT 触发器来验证条件并抛出异常:

CREATE FUNCTION ins_trig() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   IF EXISTS (SELECT 1 FROM table1
              WHERE NEW.project_number > current_project_number)
   THEN
      RAISE EXCEPTION 'project number must be less than or equal to values in table1';
   END IF;

   RETURN NEW;
END;$$;

CREATE TRIGGER ins_trig BEFORE INSERT ON table2
   FOR EACH ROW EXECUTE PROCEDURE ins_trig();