编辑不正确创建的约束

问题描述:

我想我可能错误地创建了一个约束。我有三个表:活动,身份验证,登录。我希望身份验证成为“主”表,我将在其中插入数据以创建用户以及他的详细信息。它将具有一对一的关系(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的重复约束?我怎样才能解决这个问题?

+0

'user'是否在'Login'表中有相应的条目?这是我要检查的第一件事,并且错误似乎暗示着什么。 –

+0

用户正在创建。登录表中的ID将在身份验证表中创建用户时更新,反之亦然。 – Droidzone

+0

你确定你有这个?用户必须存在于_Login_表_before_中,您可以在'Authentication'中引用它。这是这种情况吗? –

这是一个建议,希望至少能指引您朝着正确的方向发展。如果要在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

+0

感谢您的帮助指针。我很难解开限制。最后,将它导出到.sql,手动编辑并重新创建结构。 – Droidzone

+0

@philipxy谁说我不是在做mysql?我将sql导出到一个文本文件,删除了无效的密钥,然后在mysql中重新创建它。 – Droidzone

+0

@philipxy那是在我修好之前。什么是所有的治安?这仍然是一个经验较少的程序员可以澄清疑惑的地方,不是吗?我的问题有一些具体方面不符合规则或建议吗?如果是这样,欢迎您提供建设性的批评或有用的答案。 – Droidzone