sql >> データベース >  >> RDS >> Mysql

条件付き一意性制約を適用する方法

    もう1つのフィールドに固有の制約を定義します: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')
    


    1. LIKEを使用してGROUP_CONCATを検索します

    2. 安全なPropel接続、リモートMySQL

    3. Oracleインメモリコスト

    4. データベース内の箇条書きを並べ替える