假设我们有用户,每个用户可以有多个电子邮件地址
CREATE TABLE emails (
user_id integer,
email_address text,
is_active boolean
)
Run Code Online (Sandbox Code Playgroud)
一些示例行
user_id | email_address | is_active
1 | foo@bar.com | t
1 | baz@bar.com | f
1 | bar@foo.com | f
2 | ccc@ddd.com | t
Run Code Online (Sandbox Code Playgroud)
我想强制执行一个约束,即每个用户都只有一个活动地址。我怎样才能在 Postgres 中做到这一点?我可以这样做:
CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true;
Run Code Online (Sandbox Code Playgroud)
这可以防止用户拥有多个活动地址,但我相信不会防止他们的所有地址都设置为 false。
如果可能的话,我更愿意避免使用触发器或 pl/pgsql 脚本,因为我们目前没有这些脚本,而且设置起来会很困难。但我很感激知道“唯一的方法是使用触发器或 pl/pgsql”,如果是这样的话。
postgresql database-design constraint referential-integrity ddl