【发布时间】:2018-01-02 16:41:05
【问题描述】:
我想我可能错误地创建了一个约束。我有三个表:活动、身份验证、登录。我希望 Authentication 成为“主”表,我将在其中插入数据以创建用户及其详细信息。它将与新创建的表存在一对一的关系(登录中的id 到身份验证中的id),身份验证存储会话ID。第三个表与AuthenticationID 的多行存在一对多关系,对应于登录的id。
这是我创建的:
| Login | CREATE TABLE `Login` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,
`TimeLoggedIn` text NOT NULL,
`sessionid` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`),
KEY `id_2` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1 |
| Authentication | CREATE TABLE `Authentication` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(30) NOT NULL,
`password` varchar(30) NOT NULL,
`role` varchar(20) NOT NULL,
`email` varchar(50) DEFAULT NULL,
`AuthenticationID` int(6) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `Authentication_ibfk_1` FOREIGN KEY (`id`) REFERENCES `Login` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 |
| Activity | CREATE TABLE `Activity` (
`num` int(11) NOT NULL AUTO_INCREMENT,
`AuthenticationID` int(6) unsigned NOT NULL,
`TorrentMag` mediumtext NOT NULL,
PRIMARY KEY (`num`),
KEY `FK_myKey2` (`AuthenticationID`),
CONSTRAINT `FK_myKey` FOREIGN KEY (`AuthenticationID`) REFERENCES `Authentication` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_myKey2` FOREIGN KEY (`AuthenticationID`) REFERENCES `Authentication` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=latin1 |
不幸的是,当我尝试在身份验证中插入一个新行时(在我创建约束之前它一直有效),
INSERT INTO Authentication (userid, password, role, email) VALUES ("user", "SeG^SU;B2_&Uhw", "user", "someone@mydomain.com");
它给出了错误:
Cannot add or update a child row: a foreign key constraint fails (`episodescopy`.`Authentication`, CONSTRAINT `Authentication_ibfk_1` FOREIGN KEY (`id`) REFERENCES `Login` (`id`))
所以我无意中创建了我需要的反比关系?另外我似乎在表 Activity 上创建了一个重复的约束?我怎样才能解决这个问题?
【问题讨论】:
-
user在Login表中有对应的条目吗?这是我要检查的第一件事,也是错误似乎暗示的内容。 -
正在创建用户。 Login 表中的 id 会在 Authentication 表中创建用户时更新,反之亦然。
-
你确定你有这个吗?用户必须存在于 Login 表中之前您可以在
Authentication中引用它。这里是这样吗? -
这不是我想要的。我希望在身份验证中创建用户,并在登录中引用。
-
我尝试删除 FOREIGN KEY 以使用
ALTER TABLE Authentication DROP FOREIGN KEY Authentication_ibfk_1;再次创建它,然后尝试ALTER TABLE Login ADD CONSTRAINT FK_Login FOREIGN KEY (id) REFERENCES Authentication (id) ON DELETE CASCADE ON UPDATE CASCADE;但它给出了错误ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (episodescopy.#sql-3ed_1b38e, CONSTRAINT FK_Login FOREIGN KEY (id) REFERENCES Authentication (id) ON DELETE CASCADE ON UPDATE CASCADE)
标签: mysql foreign-keys constraints relational-database