相对自动增量ID

时间:2013-02-01 01:56:19

标签: python sql django

我有一个表示项目的django模型,每个模型都可以存储在特定的组中,如下所示:

+----+----------+-----+--------+
| id | group_id | ... | rel_id |
+----+----------+-----+--------+
|  1 |        1 | ... |      1 |
|  2 |        1 | ... |      2 |
|  3 |        2 | ... |      1 |
|  4 |        2 | ... |      2 |
|  5 |        1 | ... |      3 |
|  6 |        3 | ... |      1 |
|  7 |        1 | ... |      4 |
|  8 |        1 | ... |      5 |
+----+----------+-----+--------+

我需要以某种方式生成并存储rel_id值。

所以基本上我想和这里完全一样:Relative incremental ID by reference field,但动态计算不适合我,因为我必须操纵表的内容(删除,更新,获取表的一部分,等)。

这样做的最佳方式是什么?

目前,我使用PostgreSQL,但我想找到一个使用django抽象层的解决方案,因为我以后必须切换到MySQL。

2 个答案:

答案 0 :(得分:0)

这是您正在寻找的 - 一种创建rel_id列的方法吗?这应该适用于PostgreSQL:

SELECT Id, 
  Group_Id, 
  Row_Number() OVER (PARTITION BY Group_ID ORDER BY Id) rn
FROM YourTable
ORDER BY Id

这是Fiddle

这适用于MySQL:

SELECT ID, Group_Id, RowNumber
FROM (
  SELECT Id, Group_ID,
    @row_num := IF(@prev_value=Group_Id,@row_num+1,1) AS RowNumber
     ,@prev_value := Group_Id as groupRowNumber
  FROM YourTable,
     (SELECT @row_num := 1) x,
     (SELECT @prev_value := '') y
  ORDER BY Group_ID
) t

Fiddle

祝你好运。

答案 1 :(得分:0)

 

class Item(models.Model): group = models.ForeignKey(Group) number = models.IntegerField() def save(self, force_insert=False, force_update=False, using=None): super(Item, self).save(force_insert = force_insert, force_update = force_update, using = using) self.number = Item.objects.filter(group = self.group).filter(id__lte = self.id).count() super(Item, self).save(force_insert = force_insert, force_update = force_update, using = using) </pre> </code>
class Item(models.Model): group = models.ForeignKey(Group) number = models.IntegerField() def save(self, force_insert=False, force_update=False, using=None): super(Item, self).save(force_insert = force_insert, force_update = force_update, using = using) self.number = Item.objects.filter(group = self.group).filter(id__lte = self.id).count() super(Item, self).save(force_insert = force_insert, force_update = force_update, using = using) </pre> </code>

用于消除竞争条件。