sql >> Databasteknik >  >> RDS >> Mysql

hur man upprätthåller en villkorad unikhetsbegränsning

Definiera din unika begränsning i ytterligare ett fält:deleted och dina pseudo-unika fält. Sedan, för att representera en mjuk borttagning, tilldela modellens id till deleted; för återställda objekt, tilldela 0.

Med detta tillvägagångssätt, för återställda objekt, eftersom deleted fältet är konsekvent värderat, kommer den unika begränsningen med flera fält effektivt att ignorera värdet för den deleted och framtvinga unikhet för bara de pseudo-unika fälten; för raderade objekt, deleted kommer att tas med i beräkningen, och eftersom det är unikt kommer begränsningen alltid att vara uppfylld - så vilket antal modeller som helst med samma pseudo-unika fältvärden kan samexistera.

Till exempel kan följande kod vara vad du letar efter.

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


  1. Hur man får rekord med maxvärde i MySQL

  2. Appen slutade fungera på grund av databasen

  3. Postgres sql infoga frågesyntaxfel från phpPgAdmin

  4. SQL Server 2016:Alltid krypterad