尝试连接两个类/表时,我得到“外键约束失败”错误

时间:2013-03-31 14:44:06

标签: sql database grails gorm

我有这些课程,由于实际原因而缩写:

class CV {
  Date dateCreated
  static hasMany=[proposals: Proposal]
}  

class Proposal {
  String name
  Date date_started
  static hasMany = [CVs: CV]
  static belongsTo = CV
}

Grails为这两个类创建表,并为名称为“cv_proposals”的第三个类加入它们。到现在为止还挺好。我在CV和Proposal表中都有数据,它们都有自动增加的“id”值。都好。

在Oracle MySQL Workbench中,我尝试手动将值添加到连接表中以获取一些虚拟数据。我收到一条带有此跟踪的错误消息:

  

错误1452:无法添加或更新子行:外键约束失败   (cvreg_utvcv_proposals,CONSTRAINT FK17D946F55677A672外键(cv_id)参考cvid))

我确保这两个表中都有几行数据,我可以单独编辑它们。

尝试删除并重新创建表后,来回更改类,我有点确信这个操作必须通过运行的Grails应用程序来完成。所以我在控制器中编写这个脚本并运行它:

def g = CV.get(1)
Proposal proposal = g.addToProposals(new Proposal(
name: "SavingTest", 
date_started: new Date())).save()
但是,我仍然得到同样的错误。这不是定义连接到某个简历的提案的正确方法吗?我在某种程度上使用多对多连接是错误的吗?

编辑:为连接表添加模式创建脚本

delimiter $$
CREATE TABLE `cv_proposals` (  
  `proposal_id` bigint(20) NOT NULL,  
  `cv_id` bigint(20) NOT NULL,    
  PRIMARY KEY (`cv_id`,`proposal_id`),  
  KEY `FK17D946F55677A672` (`cv_id`),  
  KEY `FK17D946F5F7217832` (`proposal_id`),  
  CONSTRAINT `FK17D946F5F7217832` FOREIGN KEY (`proposal_id`) REFERENCES `proposal` (`id`),  
  CONSTRAINT `FK17D946F55677A672` FOREIGN KEY (`cv_id`) REFERENCES `cv` (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$  

CV表:

CREATE TABLE `cv` (  
  `id` bigint(20) NOT NULL AUTO_INCREMENT,  
  `version` bigint(20) NOT NULL,  
  `user_id` bigint(20) NOT NULL,  
  `version_name` varchar(255) DEFAULT NULL,  
  `date_created` datetime NOT NULL,  
  `last_updated` datetime NOT NULL,  
  PRIMARY KEY (`id`),  
  KEY `FKC734A9AB992` (`user_id`)  
) ENGINE=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=latin1$$  

提案表:

CREATE TABLE `proposal` (  
  `id` bigint(20) NOT NULL AUTO_INCREMENT,  
  `version` bigint(20) NOT NULL,  
  `date_ended` datetime NOT NULL,  
  `date_started` datetime NOT NULL,  
  `description` varchar(500) DEFAULT NULL,  
  `name` varchar(500) NOT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1$$  

这是我试图运行的插入脚本:

INSERT INTO `cvreg_utv`.`cv_proposals` (`proposal_id`, `cv_id`) 
VALUES ('1', '1');

1 个答案:

答案 0 :(得分:0)

您手动创建了表格吗?有趣的是,cv表使用MyISAM引擎,其他人使用InnoDB。

我认为您希望将InnoDB用于所有表,因为此引擎是事务性的。在我的测试中,在更改cv创建之前,我也无法创建cv_proposals表:

 CREATE TABLE cv (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    version bigint(20) NOT NULL,
    user_id bigint(20) NOT NULL,
    version_name varchar(255) DEFAULT NULL,
    date_created datetime NOT NULL,
    last_updated datetime NOT NULL,
    PRIMARY KEY (id),
    KEY FKC734A9AB992 (user_id)
    ) ENGINE=InnoDB AUTO_INCREMENT=101

之后,插件工作顺利。