我是用django。
先是建立了表A 主键Aid 自增
然后建立表B 主键Bid 自增 外键Aid
构建表结构的时候 报错 说:
error 1075 42000 incorrect table definition there can be only one auto column and it must be defined as a key
我该咋解决呢。。。
关键问题是出在ForeignKey上,因为我们自定义了BigIntegerAutoField,将其数据类型设为了bigintAUTO_INCREMENT,在建立外键里,默认情况下这个数据类型也会直接返回,因此造成了tucao_reply表里有了两个自增的字段,这是mysql不允许的。因此我们就需要改变这种默认的逻辑,而参考系统中ForeignKey的实现,发现系统其实对于AutoField也是做了特殊处理的,相关代码可以参考Django的源代码,因此我也就照着这样的方式,扩展了ForeignKey,生成的SQL语句就没有问题了回复<aclass='referer'target='_blank'>@渔樵耕读:总体来说,我觉得Django还是非常不错的,如果她还有些不完善,那我们也应该让她完善起来懂了。唉django还是不太完善啊。当然可以啊必须得是索引
<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">主键Bid没必要自增了吧,你都外键连到aid了外键肯定是可以自增的,这肯定是你的表结构写错了。你检查下你建数据的语句,大概忘了把自增字段设成主键了,也可能你在同一个表内多定义了一个自增字段。确实是一个表里两个自增字段了。一个是主键,一个是外键链接到另一个表里的主键取消B表中的外键aid的自增属性就没问题了,提示已经说得很清楚了嘛Django的话最好上代码,我还没有遇到过这样的情况代码贴上了。请注意TucaoReply中的tcId~<preclass="brush:python;toolbar:true;auto-links:false;">fromdjango.dbimportmodelsfromfieldsimportBigIntegerAutoField#pythonmanage.pyschemamigrationauthoradd_mobile_column--auto执行model修改同步db的命令#pythonmanage.pymigrate提交同步dbclassTucao(models.Model):tcId=BigIntegerAutoField(primary_key=True,max_length=20,db_column='tucao_id',help_text='主键')tcUserId=models.BigIntegerField(blank=False,max_length=11,db_column='tucao_account_id',help_text='吐嘈者帐户id,未登录者为-1')tcAccountName=models.CharField(max_length=50,blank=False,db_column='tucao_account_name',help_text='吐嘈者昵称,匿名显示ip')tcAccountEmail=models.EmailField(max_length=50,blank=False,db_column='tucao_account_email',help_text='吐嘈者email')tcContext=models.TextField(max_length=160,blank=False,db_column='tucao_context',help_text='吐嘈内容')tcPic=models.CharField(max_length=1000,blank=True,db_column='tucao_pic',help_text='吐槽图片链接')classMeta:db_table='tucao'verbose_name='吐槽表'classTucaoReply(models.Model):tcReplyId=BigIntegerAutoField(primary_key=True,max_length=19,db_column='tucao_reply_id',help_text='回复主键')tcId=models.ForeignKey(Tucao,db_column='tucao_id',blank=True,null=True)tcReplyAccountId=models.BigIntegerField(blank=False,max_length=11,db_column='tucao_reply_account_id',help_text='回复者帐户id,未登录为-1')tcReplyAccountName=models.CharField(max_length=50,db_column='tucao_reply_account_name',blank=False,help_text='回复者昵称,匿名的话记录IP')tcReplyAccountEmail=models.EmailField(max_length=50,db_column='tucao_reply_account_email',blank=False,help_text='如果未登录回复,需要记录邮箱')tcReplyContext=models.TextField(max_length=160,blank=False,db_column='tucao_reply_context',help_text='回复内容')tcReplyDate=models.DateTimeField(db_column='tucao_replay_datetime',help_text='回复时间')classMeta:db_table='tucao_reply'verbose_name='吐槽回复表'回复<aclass='referer'target='_blank'>@晴风晓月:把这个类型换成BigInteger也会报错。。。奇了怪了。回复<aclass='referer'target='_blank'>@渔樵耕读:你这个BigIntegerAutoField应该是你自己扩展的吧,我在Django的文档里没有找到,你看一下扩展有没有问题呢?回复<aclass='referer'target='_blank'>@晴风晓月:BigIntegerAutoField只是想让BigInt类型的主键自增。回复<aclass='referer'target='blank'>@渔樵耕读:应该是BigIntegerAutoField有问题回复<aclass='referer'target='blank'>@晴风晓月:难道外键不能指定字段名???
我想我已经把问题解决了。
首先我自己将实现的BigIntegerAutoField如下所示:
<preclass="brush:python;toolbar:true;auto-links:false;">classBigIntegerAutoField(models.BigIntegerField):defdb_type(self,connection):if'mysql'inconnection.class.module:return'bigintAUTO_INCREMENT'returnsuper(BigIntegerAutoField,self).db_type(connection)
由于改变了相应的数据类型,因此改写ForeignKey为如下代码:
然后将第19行代码改写如下:
<preclass="brush:python;toolbar:true;auto-links:false;">tcId=BigIntegerForeignKey(Tucao,db_column='tucao_id',blank=True,null=True)这样就没有问题了。
嘛,这个应该是数据库设计上的失误啊....
回复表里加上一个回复的tucao的id?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。