首页 > 解决方案 > PostgreSQL 对默认地址的约束

问题描述

我有一个用户表和地址表。它们之间存在 1:N 的关系(用户可以有多个地址)。在我的应用程序中,用户可以选择默认地址(isDefault: true)。

你能帮我写一个 SQL 约束,以确保只有一个地址被设置为特定用户的默认地址吗?(将新地址设置为默认值时,约束应使以前的默认地址非默认值 - isDefault: false)。

标签: postgresqlconstraints

解决方案


您可以创建过滤的唯一索引。

确切的设置取决于表的实际定义,但如果您有一个address表(其中address_id是主键,而不是外键)并且user_idusers表的外键,您可以使用:

create unique index only_one_default_address 
    on address (user_id) 
where is_default;

这将防止同一用户使用两个默认地址,但允许无限的非默认地址。


但是,任何约束都不会更改数据,因此必须使用触发器来实现“在将新地址设置为默认值时,约束应使以前的默认地址为非默认值”的要求。

create or replace function reset_default_address()
  returns trigger
as
$$
begin  
  if new.is_default then 
     update address
       set is_default = false
     where user_id = new.user_id;
  end if;
  return new;
end;  
$$
language plpgsql;

create trigger trg_change_default_address
  before update or insert on address
  for each row
  when (new.is_default)
  execute procedure reset_default_address();

在线示例


推荐阅读