MySQL:无法添加或更新子行:外键约束失败
在我的应用程序中,组织的管理员可以将用户添加到其组织中。一旦表单提交,我首先用用户电子邮件和与管理员关联的组织ID向我的用户表中插入新记录。在创建该用户之后,将用户电子邮件和用户组织标识和user_id
创建用于将用户连接到组织的成员记录。我遇到的问题是在最近创建的用户user_id
的成员表上创建记录。虽然我没有问题,存储organization_id
目前,由于某种原因使user_id
抛出相关的外键的错误:MySQL:无法添加或更新子行:外键约束失败
Cannot add or update a child row: a foreign key constraint fails (`work`.`member`, CONSTRAINT `member_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `organization` (`organization_id`) ON DELETE CASCADE ON UPDATE CASCADE)]
为什么我不能转嫁纪录创造USER_ID。是否因为该列与外键关联?
下面是插入数据:
用户插入件(没有错误):
INSERT INTO `user` (`user_id`,`email`,`organization_id`,`updatedAt`,`createdAt`) VALUES (DEFAULT,'[email protected]','1','2016-06-07 11:51:54','2016-06-07 11:51:54');
会员插入(错误与USER_ID):
INSERT INTO `member` (`member_id`,`member_email`,`organization_id`,`user_id`,`updatedAt`,`createdAt`) VALUES (DEFAULT,'[email protected]','1',8,'2016-06-07 11:51:54','2016-06-07 11:51:54');
用户表:
`user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`organization_id` int(11) DEFAULT NULL,
`authentication_token` varchar(255) DEFAULT NULL,
`reset_password_token` varchar(255) DEFAULT NULL,
`reset_password_expires` datetime DEFAULT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
组织表:
`organization` (
`organization_id` int(11) NOT NULL AUTO_INCREMENT,
`organization_name` varchar(255) DEFAULT NULL,
`admin` varchar(255) DEFAULT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`organization_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
会员表:
`member` (
`member_id` int(11) NOT NULL AUTO_INCREMENT,
`member_email` varchar(255) DEFAULT NULL,
`organization_id` int(11) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`member_id`),
UNIQUE KEY `member_email` (`member_email`),
UNIQUE KEY `member_user_id_organizationId_unique` (`organization_id`,`user_id`),
KEY `user_id` (`user_id`),
CONSTRAINT `member_ibfk_1` FOREIGN KEY (`organization_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `member_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `organization` (`organization_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
在我看来,你已经混淆了你的约束。
我使用sql创建了表,并使用MySQLWorkbench进行了反向工程,以获得包含表的EER。
在第一眼就可以看到表组织的organization_ID与在成员表user_ID的链接。
如果你改变你的约束下面,将工作:
CONSTRAINT `member_ibfk_1` FOREIGN KEY (`organization_id`) REFERENCES `organization` (`organization_id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `member_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
好的观察结果。而且,用户在'member'上的插入缺少'organisation_id' –
我认为他已经在他的表中存在organization_id 1 – DKSan
我的意思是OP的'insert'语句。我相信他没有包含正确的'organization_id'值。 –
尝试约束member_ibfk_1
改成这样:
CONSTRAINT `member_ibfk_1` FOREIGN KEY (`organization_id`) REFERENCES user(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
什么是你的user_id在用户表中的值,插入后? – ZeusNet
@OP:表'organization'中是否存在'organization_id'值'1'? –
'organization_id int(11)DEFAULT NULL,'表中的用户似乎已经过时了,您的链接表成员可以删除 – DKSan