我想添加一个约束,将检查来自相关表的值。
我有三张table:
CREATE TABLE somethink_usr_rel (
user_id BIGINT NOT NULL,
stomethink_id BIGINT NOT NULL
);
CREATE TABLE usr (
id BIGINT NOT NULL,
role_id BIGINT NOT NULL
);
CREATE TABLE role (
id BIGINT NOT NULL,
type BIGINT NOT NULL
);
(If你想让我约束FK让我知道。)
我想给somethink_usr_rel
添加一个约束,检查role
中的type
(“两个表之外”),例如:
ALTER TABLE somethink_usr_rel
ADD CONSTRAINT CH_sm_usr_type_check
CHECK (usr.role.type = 'SOME_ENUM');
我试着用JOIN
来实现这个功能,但是没有成功。有什么想法吗?
4条答案
按热度按时间lymgl2op1#
CHECK
约束当前不能引用其他表。The manual:当前,
CHECK
表达式不能包含子查询,也不能引用当前行的列以外的变量。一种方法是使用demonstrated by @Wolph这样的触发器。
清洁解决方案,无触发器:添加冗余列并将它们包含在**
FOREIGN KEY
约束**中,这是实施参照完整性的首选。dba.SE上的相关答案以及详细说明:另一个选择是**“fake”一个
IMMUTABLE
函数**执行检查并在CHECK
约束中使用它。Postgres将允许这样做,但要注意可能的警告。最好将其作为NOT VALID
约束。请参见:j8ag8udp2#
如果需要联接,则
CHECK
约束不是一个选项。您可以创建引发错误的触发器。请看这个例子:http://www.postgresql.org/docs/9.1/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
kmpatx3s3#
...我这样做了(nazwa=用户名,firma =公司名称):
mcdcgff04#
一个表可以有多个外键约束条件。这用于实现表之间的多对多关系。假设您有关于产品和订单的表,但现在您希望允许一个订单包含可能多个的产品(上面的结构不允许)。您可以使用以下表结构: