sql - 如何确保 Column_A 仅在 Column_B 为 NULL 时才有值?反之亦然

标签 sql postgresql constraints check-constraints

我正在尝试创建一个包含三列的表格:

id

paid_at

failed_at

如何确保 paid_at 仅在 failed_atNULL 时才具有值?

这是我当前的代码:

 CREATE TABLE charges(
      id        TEXT     NOT NULL     PRIMARY KEY,
      paid_at   TEXT,
      failed_at TEXT
    );

    ALTER TABLE charges
      ADD CONSTRAINT paid_at CHECK (failed_at IS NULL);

    ALTER TABLE charges
      ADD CONSTRAINT failed_at CHECK (paid_at IS NULL);

我还想确保 BOTH 不能为空。

我该怎么做?

谢谢!

最佳答案

您可以在检查约束中使用num_nonnulls():

alter table charges 
  add constraint only_one_not_null 
  check (num_nonnulls(paid_at, failed_at) = 1);

确保其中一列不为空,另一列为空。

如果您认为只有空格的字符串也为“null”,您可以将其扩展为:

alter table charges 
  add constraint only_one_not_null 
  check (num_nonnulls(nullif(trim(paid_at),''), nullif(trim(failed_at),'')) = 1);

关于sql - 如何确保 Column_A 仅在 Column_B 为 NULL 时才有值?反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478656/

相关文章:

sql - INSERT 语句与 FOREIGN KEY 约束冲突。数据库发生冲突

c# - 队列操作处理模式

postgresql - 为什么我的 Postgres 交叉表会产生错误 : 'Query-specified return tuple has 7 columns but crosstab returns 6' ?

jakarta-ee - 约束和注释有什么区别?

mysql - 试图在子查询中获取行数

c# - System.Data.Sqlite 是否支持 Entity Framework 6?

function - 授予使用函数的 View 的选择权

sql - Postgres 基于触发器的插入重定向而不中断 RETURNING

cocoa-touch - 使用自动布局在导航栏中自动调整标题 View 的大小

MySQL - 添加约束一次,在不同情况下添加两次