Django设置联合唯一约束 -- migrate时报错处理

异常信息:

   a unique database constraint for 2 or more fields together

场景描述:

对于ORM中多对多关系的中间表,如果该关系表是手动创建的,建表的时候,两个字段没有添加联合唯一约束;

系统运行一段时间后,若是需求变更,需要对其增加联合唯一约束,而当前的关系表中可能已存在重复数据了,那么在添加联合唯一约束,执行数据同步操作migrate的时候,就会报错;这时,可以参考这种处理方式。

推荐一篇博客:http://shineforever.blog.51cto.com/1429204/1729286

一个表的model中,根据生产环境需要,需要设置site和对应的cdn服务器ip是联合唯一的,最开始创建表的时候,没有考虑到这个问题,后来设置了联合唯一约束 unique_together,在同步数据migrate的时候,报错:a unique database constraint for 2 or more fields together

很明显数据库中有很多这两个字段重复的数据,所以要删除重复数据后再migrate就没问题了,但是怎么删除这些数据呢?

通过以下两个步骤即可:

1)CREATE TEMPORARY TABLE tmp_table SELECT * FROM 目标表;
2)delete from 目标表 where id not in (select max(id) from tmp_table group by cdn_ipaddr,site_id);

说明:

创建临时表,把目标表的数据复制到临时表中;

删除目标表中数据,只留id最大的‘重复数据’即可!

转载于:https://www.cnblogs.com/hellojesson/p/6379487.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值