【问题标题】:typeorm not working with softdeleted records and unique constraint fieldtypeorm 不适用于软删除记录和唯一约束字段
【发布时间】:2021-05-11 21:12:08
【问题描述】:

我正在尝试使用 typeorm softdelete 功能,为了删除它的罚款,向 deletedAt 字段添加时间戳,但是当你有像“用户名”这样的唯一字段并且你软删除它然后尝试添加另一条具有相同“用户名”的记录时,问题就出现了"字段值作为删除记录。它不接受它,因为它已经插入一次并且数据库对软删除没有感知。所以我尝试添加另一个字段,使其成为结合“用户名”和“deletedAt”的复合唯一约束,在 Postgres 中似乎 Null 没有像我预期的那样被索引。因此,您可能再次为 deletedAt 添加具有相同“用户名”和相同“NULL”值的多条记录。 试图通过将默认值 0 分配给 deletedAt 来绕过这一点,现在我认为主要问题是如何告诉 typeorm 对待 0 与在获取查询时对待 NULL 相同。

【问题讨论】:

  • 你解决了吗?如果有,你介意分享一下吗?

标签: postgresql duplicates typeorm unique-constraint soft-delete


【解决方案1】:

你可以试试部分索引

CREATE UNIQUE INDEX ix_username ON usertable (username)
WHERE (deletedAt is null);

Postgres: Partial Indexes

【讨论】:

  • 谢谢@Edward,好技巧。对于那些可能遇到这个问题的人,where 子句实际上是(deletedAt 为空),如果您编辑它,我将不胜感激。 * 在 typeorm 中,用户名“foo”的第一个插入记录没有 deletedAt 值,因此它的值为 null ,由于这个部分索引,它没有被索引,因此仍然可以插入具有相同用户名“foo”的下一条记录。这可能是真的,如果像 0 这样的东西是一个默认值,它首先消除了提出这个问题的根源。
  • @ItsJay - 我很高兴它成功了 - 我已将答案更新为(deletedAt 为空)
  • 你知道mariadb(或mysql)是否有替代品吗? orm 级别的解决方案将是理想的。
  • @kb05 我不知道也不明白你在问什么。您应该创建一个新问题,可能会引用这个问题,并清楚地说明您的问题。
猜你喜欢
  • 1970-01-01
  • 2014-07-11
  • 2012-10-26
  • 2020-01-27
  • 2021-10-24
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多