我有这些课程,由于实际原因而缩写:
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_utv
。cv_proposals
,CONSTRAINTFK17D946F55677A672
外键(cv_id
)参考cv
(id
))
我确保这两个表中都有几行数据,我可以单独编辑它们。
尝试删除并重新创建表后,来回更改类,我有点确信这个操作必须通过运行的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');
答案 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
之后,插件工作顺利。