2016-06-07 282 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, 
相關問題