【问题标题】:PostgreSQL prevent row with null password when authentication type name is password当身份验证类型名称为密码时,PostgreSQL 会阻止密码为空的行
【发布时间】:2022-12-10 17:45:28
【问题描述】:

我在 PostgreSQL 中有 2 个表

认证类型

id name created_at updated_at
c1cc0489-4740-4dca-9d63-14e4c26093ad password ... ...

帐户

id email password authentication_type_id created_at updated_at
... abc@example.com (foreign key to the other table) ... ...

我想在以下条件下插入该行

  • 认证类型名称为password时,password列的值不能为null

我试过什么?

CHECK CONSTRAINT (
  authentication_type_id='c1cc0489-4740-4dca-9d63-14e4c26093ad'
  AND
  password IS NOT NULL
) 

但这不起作用。我不确定如何在这里写一个 if else 条件

问题

  • 是否可以使用 CHECK CONSTRAINT 执行此操作,或者我是否需要插入前触发器?两者有什么区别?

如果有帮助,我正在使用 sequelize 来执行此操作

【问题讨论】:

  • 每当您在 CHECK 中使用 AND 时,您都在检查两个单独的条件,应该考虑将其设为两个单独的 CHECK。在这种情况下,这不是您想要的,所以 AND 是错误的。有关详细信息,请参阅我的答案。

标签: sql postgresql triggers sequelize.js constraints


【解决方案1】:

你弄错了布尔逻辑。您需要以下一项(或两项):

  • type_id 不是“password-id”
  • 密码不为空
CHECK CONSTRAINT (
    authentication_type_id != 'c1cc0489-4740-4dca-9d63-14e4c26093ad'
    OR
    password IS NOT NULL
)

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2013-02-15
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多