簡體   English   中英

InnoDB外鍵難點?

[英]InnoDB foreign key difficulty?

下面我有兩個表

用戶users_profiles

兩者都是innoDB和歸類:utf8_general_ci

它們如下:

用戶

CREATE TABLE `users` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`status` char(10) NOT NULL,
`username` varchar(15) NOT NULL,
`email` varchar(50) NOT NULL,
`password` char(32) NOT NULL,
`reg_date` int(11) NOT NULL,
`ip` varchar(39) DEFAULT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`,`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

users_profiles

CREATE TABLE `users_profiles` (
`uid` int(11) NOT NULL,
`first_name` varchar(40) DEFAULT NULL,
`last_name` varchar(50) DEFAULT NULL,
`gender` char(6) DEFAULT NULL,
`website` varchar(100) DEFAULT NULL,
`msn` varchar(60) DEFAULT NULL,
`aim` varchar(60) DEFAULT NULL,
`yim` varchar(60) DEFAULT NULL,
`twitter` varchar(15) DEFAULT NULL,
UNIQUE KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在phpmyadmin中創建表后,我在users_profiles表上創建了一個外鍵,以下代碼是phpMyAdmin創建的。

如下:

ALTER TABLE `users_profiles`
ADD CONSTRAINT `users_profiles_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE;

基本上,users_profiles.uid是一個外鍵,並引用了users.uid

在phpMyAdmin中,我要插入並填寫一些示例數據,而使uid顯然要自動遞增。 當我在用戶表中插入一條記錄時,我進入了users_profiles表,並注意到users.uid沒有自動插入到users_profiles中,

這是正常的嗎?

原因是,例如有人在表格上注冊時,系統會要求他們輸入用戶名,電子郵件和密碼,而我在php中進行查詢以將該數據插入到用戶表中,我認為因為我有一個外鍵,所以自動在users_profiles表中插入帶有來自users表的uid的行,以便在用戶和個人資料之間存在鏈接。 但是當我在用戶表中插入一條記錄時,users.uid並沒有插入到users_profiles表中。

我嘗試了另一個示例以查看會發生什么,並且由於更新和刪除的級聯,該示例可以按我的預期工作。

如果我在用戶表中插入一行,然后手動將users.uid插入users_profiles.uid(它們現在已鏈接)並添加例如first_name和last_name,然后在phpmyadmin中從users表中刪除用戶,則會刪除users_profiles中的行表。 這顯然應該工作,因為我不希望刪除用戶並保留個人資料。

這讓我感到困惑,因為當我創建表單並進行用戶注冊時,他們基本上沒有配置文件,因為在注冊時沒有為用戶創建任何配置文件,user_profiles表中沒有user.uid(他們之間沒有鏈接),盡管我有一個外鍵。

有人可以解釋為什么它沒有按我預期的那樣工作,也許它應該像我想要的那樣工作,但是出了點問題,否則我會遺漏整個要點。


UPDATE

引用@Mark Wilkins的回復

我明白你的意思了。 但是我不確定100%是這樣的:

用戶注冊,在用戶表中創建一條記錄; 他們登錄並訪問個人資料頁面,可以在其中填寫並提交表格。

在處理表格時,我認為我將需要執行以下操作:

用戶填寫個人資料表格並提交(他們是新用戶時首次提交個人資料),在驗證數據等之后,我首先檢查users表中的uid是否與users_profile表中的uid匹配,如果存在匹配項,則具有新值的UPDATE記錄(這意味着用戶以前已經在那里填寫了配置文件,因為他們沒有注冊),但是如果在兩個表的uid上都找不到匹配項,那么我將執行INSERT查詢,因為尚無配置文件為用戶。 我認為顯然我會在成功登錄后將用戶表中的uid與其他數據存儲在一起,並且成功登錄時的uid將是插入到列uid的users_profiles表中的uid? 這樣,將在兩個表之間創建鏈接,如果我現在決定刪除該用戶,那里的配置文件也將被刪除。

外鍵約束不是設計用來創建行的。 它們的目的是通過強制在子表中引用父表值的值實際上存在於該父表中,並防止刪除在子表中具有對其引用的父行來確保數據完整性。

插入時,調用代碼必須將行寫入兩個表(首先是用戶,然后是配置文件)。

如果我正確地遵循了說明,則它可以按預期運行。 外鍵關系從根本上說,給定的孩子必須有一個父母(在您的示例中,給定的user_profile必須有一個用戶)。 不需要相反的操作(用戶存在user_profile記錄)。 它永遠不會導致在子表上執行INSERT。 您必須將記錄插入到user_profile表中,並且外鍵關系將保證對其進行維護。

編輯其他OP信息:通常,是的,我相信這是您想要做的事情。 我對Web開發的處理還不夠,無法知道該特定過程是否正確。 但是,無論哪種情況(無論是否創建了個人檔案記錄),您都需要知道要修改哪個用戶。 但是,我對此的看法是在創建用戶記錄后立即創建關聯的user_profile記錄(只需在其中保留信息字段為空)。 這樣一來,您便可以知道在編輯時它的存在,而不必執行MERGE樣式的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM