Mysql
 sql >> Datenbank >  >> RDS >> Mysql

wie man eine bedingte Eindeutigkeitsbeschränkung erzwingt

Definieren Sie Ihre eindeutige Einschränkung über ein weiteres Feld:deleted und Ihre pseudo-eindeutigen Felder. Weisen Sie dann, um ein vorläufiges Löschen darzustellen, die ID des Modells deleted zu; Weisen Sie für nicht gelöschte Elemente 0 zu.

Bei diesem Ansatz gilt für nicht gelöschte Elemente, da deleted -Feld einen konsistenten Wert hat, ignoriert die Mehrfeld-Eindeutigkeitsbeschränkung effektiv den Wert von deleted und Eindeutigkeit nur für die Pseudo-Eindeutigkeitsfelder erzwingen; für gelöschte Elemente deleted wird berücksichtigt, und da es eindeutig ist, wird die Einschränkung immer erfüllt – sodass eine beliebige Anzahl von Modellen mit denselben pseudo-eindeutigen Feldwerten koexistieren kann.

Der folgende Code könnte beispielsweise das sein, wonach Sie suchen.

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