我已经创建了函数来检查电子邮件是否存在于用户表中,然后它允许在其他表行条目中。但它是强制性的,所以正确的电子邮件或空是允许的。但我不确定如何修改此约束来执行此操作。约束函数在这里
CREATE OR REPLACE FUNCTION check_email_allowed(text)
RETURNS bool AS
$func$
SELECT EXISTS (SELECT 1 FROM users WHERE email = $1);
$func$
LANGUAGE sql STABLE; -- not actually IMMUTABLE
现在我已经将这个约束添加到我的表accounts
ALTER TABLE accounts ADD CONSTRAINT email_allowed
CHECK (email_allowed(email)) NOT VALID;
这是工作良好,但如果我提供空字段的电子邮件字段在帐户,它抛出错误。但我想确保null
或email for users表都被接受。我不能设置关系,因为它是非常不同的关系,这里只是举个例子,我使用user/account。
另一种方法是跟随
ALTER TABLE accounts ADD CONSTRAINT email_allowed
FOREIGN KEY (email) REFERENCES users(email);
但它也有同样的问题,我不能在列中使用null。我创建了关系如前所述。这是我的表结构。
表:账户
id account_name assignee
1 name email@example.com
2 name null
用户表:id name email
1 someone email@example.com
我想确定在帐户表电子邮件要么为空或只有值从用户电子邮件我想保留在
答案是添加关系,所以列是可空的,然后它将接受空
但是如果提供了任何电子邮件,那么下一行将确保它出现在user ->
邮件列ALTER TABLE accounts ADD CONSTRAINT FK_users_email FOREIGN KEY (email) REFERENCES users(email);
所有注释都是有效的,我有错误,因为我之前运行了一个迁移,所以它正在起作用。