Mysql
 sql >> Base de données >  >> RDS >> Mysql

comment appliquer une contrainte d'unicité conditionnelle

Définissez votre contrainte unique sur un champ supplémentaire :deleted et vos champs pseudo-uniques. Ensuite, pour représenter une suppression réversible, attribuez l'identifiant du modèle à deleted; pour les éléments non supprimés, attribuez 0.

Avec cette approche, pour les éléments non supprimés, puisque le deleted champ est valorisé de manière cohérente, la contrainte unique multi-champs ignorera effectivement la valeur du deleted et imposer l'unicité uniquement pour les champs pseudo-uniques ; pour les éléments supprimés, deleted sera pris en compte, et puisqu'il est unique, la contrainte sera toujours satisfaite - donc n'importe quel nombre de modèles avec les mêmes valeurs de champs pseudo-uniques peuvent coexister.

Par exemple, le code suivant peut correspondre à ce que vous recherchez.

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')