我有这些课程,出于实际原因缩写:
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
FOREIGN KEY (cv_id
) REFERENCEScv
(id
))
我确保两个表中都有几行数据,并且我可以分别编辑它们。
在尝试删除并重新创建表,来回更改类之后,我有点相信这个操作必须通过正在运行的 Grails 应用程序来完成。所以我在控制器中编写了这个脚本并运行它:
def g = CV.get(1)
Proposal proposal = g.addToProposals(new Proposal(
name: "SavingTest",
date_started: new Date())).save()
不过,我仍然遇到同样的错误。这不是定义与某个 CV 相关的提案的正确方法吗?我在这里以某种方式使用多对多连接是错误的吗?
编辑:为连接表添加模式创建脚本
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$$
还有简历表:
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');