2016-06-07 285 views
-1

在我的应用程序中,组织的管理员可以将用户添加到其组织中。一旦表单提交,我首先用用户电子邮件和与管理员关联的组织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; 
+0

什么是你的user_id在用户表中的值,插入后? – ZeusNet

+0

@OP:表'organization'中是否存在'organization_id'值'1'? –

+0

'organization_id int(11)DEFAULT NULL,'表中的用户似乎已经过时了,您的链接表成员可以删除 – DKSan

回答

2

在我看来,你已经混淆了你的约束。

我使用sql创建了表,并使用MySQLWorkbench进行了反向工程,以获得包含表的EER。

enter image description here

在第一眼就可以看到表组织的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 
+0

好的观察结果。而且,用户在'member'上的插入缺少'organisation_id' –

+0

我认为他已经在他的表中存在organization_id 1 – DKSan

+0

我的意思是OP的'insert'语句。我相信他没有包含正确的'organization_id'值。 –

1

尝试约束member_ibfk_1改成这样:

CONSTRAINT `member_ibfk_1` FOREIGN KEY (`organization_id`) REFERENCES user(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
相关问题