gpt4 book ai didi

mysql - 如何强制执行条件唯一性约束

转载 作者:行者123 更新时间:2023-11-29 03:09:08 26 4
gpt4 key购买 nike

假设我有一堆表,其中对象被标记为已删除而不是实际删除。现在,我想强制执行一个约束,即只能有一个具有一组特定字段值的未删除对象,但我可以有多个具有相同字段值的已删除对象。

class Deletable(models.Model):
deleted = models.BooleanField(default=False)

class Meta:
abstract=True

def soft_delete(self):
self.deleted=True
self.save()

class ConcreteModel(Deletable):
a = models.IntegerField()
b = models.IntegerField()

class Meta:
#wrong because there may have been some deleted rows
unique_together=('a', 'b')

执行约束的最佳方式是什么?

最佳答案

在另一个字段中定义您的唯一约束:deleted 和您的伪唯一字段。然后,为了表示软删除,将模型的 id 分配给 deleted;对于未删除的项目,分配 0。

使用这种方法,对于未删除的项目,由于 deleted 字段的值是一致的,多字段唯一约束将有效地忽略 deleted 的值并强制执行仅伪唯一字段的唯一性;对于已删除的项目,deleted 将被考虑在内,并且由于它是唯一的,因此将始终满足约束 - 因此任何数量的具有相同伪唯一字段值的模型都可以共存。

例如,以下代码可能就是您要查找的内容。

class Deletable(models.Model):
deleted = models.IntegerField(default=0)

class Meta:
abstract=True

def soft_delete(self):
self.deleted=self.id
self.save()

class ConcreteModel(Deletable):
a = models.IntegerField()
b = models.IntegerField()

class Meta:
unique_together=('a', 'b', 'deleted')

关于mysql - 如何强制执行条件唯一性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11006191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com