检查 (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();
我需要创建一个 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();