You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django PostgreSQL表:能否移除自动生成id列,改用联合主键?

可以移除自动生成的id列,用user和data的组合作为主键

完全可以这么做,既然你已经明确user_id和data的组合具备唯一性,刚好可以把这个组合设为表的主键,替代自动生成的id列,从而节省存储空间。

具体实现步骤

1. 修改Django Model定义

你需要调整Data模型,去掉默认的id主键,将user和data字段设置为联合主键,有两种常见方式:

方式一:直接给字段设置primary_key=True

from django.db import models

class Data(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, primary_key=True)
    data = models.CharField(max_length=32, primary_key=True)

Django会自动识别这两个字段为联合主键,同时保证它们的组合唯一性。

方式二:使用UniqueConstraint(Django 2.2+推荐)

如果你更倾向于显式定义唯一约束,也可以在模型的Meta类中添加UniqueConstraint,并指定这个约束作为主键:

from django.db import models

class Data(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    data = models.CharField(max_length=32)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'data'], name='user_data_unique', primary_key=True)
        ]

2. 执行数据库迁移

修改完模型后,生成并执行迁移文件:

python manage.py makemigrations
python manage.py migrate

注意:执行迁移前一定要备份数据库,避免因主键变更导致的数据丢失或异常。

需要注意的细节

  • 后续操作(查询、更新、删除)这条记录时,需要同时通过user和data两个字段来定位,比如:
    # 查询示例
    Data.objects.get(user=some_user, data="foo")
    
  • 如果有其他模型通过外键关联Data,需要同步修改外键定义,改为引用这两个字段的组合(Django支持复合外键)。
  • 存储空间的节省:PostgreSQL默认的id是bigint类型(占8字节),移除后每行数据都会减少8字节的占用,数据量越大,节省的空间越明显。

内容的提问来源于stack exchange,提问作者BENJAMIN GILBERT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 18:53:31