2017-07-27 59 views
0

我想我可能錯誤地創建了一個約束。我有三個表:活動,身份驗證,登錄。我希望身份驗證成爲「主」表,我將在其中插入數據以創建用戶以及他的詳細信息。它將具有一對一的關係(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'中引用它。這是這種情況嗎? –

回答

1

這是一個建議,希望至少能指引您朝着正確的方向發展。如果要在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