postgresql - PostgreSQL 对默认地址的约束
问题描述
我有一个用户表和地址表。它们之间存在 1:N 的关系(用户可以有多个地址)。在我的应用程序中,用户可以选择默认地址(isDefault: true)。
你能帮我写一个 SQL 约束,以确保只有一个地址被设置为特定用户的默认地址吗?(将新地址设置为默认值时,约束应使以前的默认地址非默认值 - isDefault: false)。
解决方案
您可以创建过滤的唯一索引。
确切的设置取决于表的实际定义,但如果您有一个address
表(其中address_id
是主键,而不是外键)并且user_id
是users
表的外键,您可以使用:
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();
推荐阅读
- scala - 如果找不到匹配,则将 findFirstMatchIn 设置为忽略行-spark-scala
- apache-spark - 如何在结构化流中保持和重置状态?
- android - 如何在 AIDE 中使用 Room?
- javascript - 如何在 React 中访问孩子的状态?(反应钩子)
- bitbucket-pipelines - bitbucket 管道部署批准
- python - 解析 find 的输出
- c# - 如何使用 .NET Core 2.1 中的 Process.Start 使用默认程序打开网络共享驱动器上的文件
- github - 使用特定库在 Github 上查找流行的开源项目
- excel - 如何打开personal.xlsb并在所有打开的excel和csv文件上自动运行宏?
- python - python/pandas:将月份整数转换为“int”数据类型的实际月份名称