MySQL上的Odd IntegrityError:#1452

时间:2011-01-13 15:47:57

标签: mysql django django-models

这有点奇怪,但我会尽力解释。我有两个模型:一个代表电子邮件消息(消息),另一个代表销售线索(AffiliateLead)。当通过网站提交表单时,系统会生成一个潜在客户,然后发送电子邮件。 Message模型有一个可选的FK返回Lead。从消息模型文件:

lead = models.ForeignKey('tracking.AffiliateLead', blank=True, null=True)

现在,这个基本shell工作:

from tracking.models import Affiliate, AffiliateLead
from messages.models import Message
from django.contrib.auth.models import User

u = User.objects.get(username='testguy')
a = Affiliate.objects.get(affiliate_id = 'ACD023')
l = AffiliateLead(affiliate = a)
l.save()
m = Message(recipient=u, sender=u, subject='s', body='a', lead=l)
m.save()

但是,表单视图本身没有。当我尝试保存指向AffiliateLead的消息时抛出IntegrityError:

(1452, 'Cannot add or update a child row: a foreign key constraint fails (`app`.`messages_message`, CONSTRAINT `lead_id_refs_id_6bc546751c1f96` FOREIGN KEY (`lead_id`) REFERENCES `tracking_affiliatelead` (`id`))')

尽管视图只是采用表单,创建和保存AffiliateLead,然后创建和(尝试)保存消息。实际上,当抛出此错误时,我可以进入MySQL并查看新创建的潜在客户。当我在保存之前立即从DB重新检索线索时,它甚至会在视图中抛出此错误:

af_lead = AffiliateLead.objects.get(id = af_lead.id)
msg.lead = af_lead
msg.save()

最后,如果我立即刷新(重新提交表单),它就可以了。没有IntegrityError。如果我让Django打印出它正在执行的SQL,我确实可以看到它在尝试INSERT消息之前插入AffiliateLead,而消息INSERT正在使用正确的AffiliateLead ID。我真的很难过。我甚至尝试过手动交易处理无济于事。

1 个答案:

答案 0 :(得分:13)

我不确定为什么会这样,但我似乎确实找到了解决方案。我正在使用South来管理数据库;它创建了作为InnoDB的消息和AffiliateLead作为MyISAM。将AffiliateLead表更改为InnoDB结束了IntegrityErrors。希望这有助于其他人。

相关问题