编辑不正确创建的约束
问题描述:
我想我可能错误地创建了一个约束。我有三个表:活动,身份验证,登录。我希望身份验证成为“主”表,我将在其中插入数据以创建用户以及他的详细信息。它将具有一对一的关系(id
在登录到id
在身份验证)与新创建的表,身份验证存储会话ID。对于AuthenticationID
,第三个表格将与多个行有一对多关系,这对应于Login的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", "[email protected]");
它给了错误:
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的重复约束?我怎样才能解决这个问题?
答
这是一个建议,希望至少能指引您朝着正确的方向发展。如果要在Authentication
表中创建用户,则任何引用主键Authentication
(即id
)的任何其他表列都应声明为外键引用。
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),
CONSTRAINT fk_1 FOREIGN KEY (id) REFERENCES Authentication (id)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1
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)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1
您当前的设置是相反的,要求用户在Login
存在之前它能够被插入到Authentication
。
'user'是否在'Login'表中有相应的条目?这是我要检查的第一件事,并且错误似乎暗示着什么。 –
用户正在创建。登录表中的ID将在身份验证表中创建用户时更新,反之亦然。 – Droidzone
你确定你有这个?用户必须存在于_Login_表_before_中,您可以在'Authentication'中引用它。这是这种情况吗? –