我正在使用mysql 5.5和Rails 3.2.13。我有这样的表:
'CREATE TABLE `visit` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`uri` varchar(2048) COLLATE utf8_unicode_ci NOT NULL,
`remote_ip` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`user_agent` varchar(2048) COLLATE utf8_unicode_ci NOT NULL,
`client_id` bigint(20) DEFAULT NULL,
`position_id` bigint(20) DEFAULT NULL,
`job_posting_id` bigint(20) DEFAULT NULL,
`assessment_id` bigint(20) DEFAULT NULL,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idv_visit_assess_id` (`assessment_id`),
KEY `fk_visit_client` (`client_id`),
KEY `fk_visit_position` (`position_id`),
KEY `fk_visit_job_posting` (`job_posting_id`)
) ENGINE=InnoDB AUTO_INCREMENT=28649 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
这样的模特:
class Visit < ActiveRecord::Base
has_many :visit_actions
end
我可以不时在生产日志中观察到这样的错误('remote_ip'已更改):
#<ActiveRecord::InvalidForeignKey: ActiveRecord::JDBCError: Cannot add or update a child row: a foreign key constraint fails (`hirex/visit`, CONSTRAINT `fk_visit_job_posting` FOREIGN KEY (`job_posting_id`) REFERENCES `job_posting` (`id`)): INSERT INTO `visit` (`assessment_id`, `client_id`, `created_at`, `job_posting_id`, `position_id`, `remote_ip`, `updated_at`, `uri`, `user_agent`) VALUES (NULL, NULL, '2013-09-13 00:25:02', 8716, NULL, '127.0.0.1', '2013-09-13 00:25:02', '/applicant/exit_job_posting', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)')>
我花了几天时间试图重现这个问题,但没有成功。如果我试图插入null而不是真正的'job_posting_id'或者令人兴奋的job_posting的id,那就没关系了。
有什么想法吗?
答案 0 :(得分:1)
发生的事情是你(或其他人试图添加job_posting_id
表中不存在的job_posting
。我没有太多代码来说明为什么会发生这种情况,最常见的原因之一是有人在提交表单时(job_posting
选择),在提交之前,有人将job_posting
移除。
Rails在没有外键约束的情况下工作效率非常高 - 有什么特别的理由可以强制执行它们吗?