2012-05-27 77 views
0

我正在創建一個表,其中主catgory(父列)包含0,其中子類別包含父類別的ID。我聽說它被稱爲參考。我的問題:我的桌子是否正確結構?或者有更好的方法來實現遍歷樹或類似的方法嗎?MySQL:交叉表引用(主,主,名)的類別和子類別?

CREATE TABLE `categories` (
`primary_id` int(11) NOT NULL auto_increment, 
`master_id` int(11) NOT NULL default '0', 
`name` varchar(50) NOT NULL default '', 
PRIMARY KEY (`c_id`) 
) 

INSERT INTO `categories` (`primary_id`, `master_id`, `name`) VALUES 
(1, '0', 'Games'), 
(2, '0', 'Technology'), 
(3, '0', 'Science'), 
(4, '0', 'Pop Culture'), 
(5, '0', 'Jobs/Services'), 
(6, '0', 'Blogs'), 
(7, '1', 'Computer'), 
(8, '1', 'Game Console'), 
(9, '2', 'Cellphone'), 
(10, '2', 'Audio/Video/Photos'), 
(11, '2', 'Laptop'), 
(12, '2', 'Others >'), 
(13, '3', 'Human Body'), 
(14, '3', 'Ocean Life'), 
(15, '3', 'Plant Life'), 
(16, '3', 'Animal Life'), 
(17, '4', 'Artist'), 
(18, '4', 'Upcoming'), 
(19, '5', 'Jobs'), 
(20, '5', 'Tutoring'), 
(21, '5', 'Seminars'), 
(22, '5', 'Haircuts'), 
(23, '9', 'Iphone'), 
(24, '9', 'Android'), 
(25, '9', 'Windows Mobile'), 
(26, '11', 'Toshiba'), 
(27, '11', 'HP'), 
(28, '11', 'Apple'), 

回答

1

如果您使用InnoDB引擎,則可以爲您的表強制實施參照完整性。這樣一來,您就可以確保你永遠不插入不具有匹配的父ID的類別,級聯刪除子類別,當你刪除父等更改創建聲明:

CREATE TABLE `categories` (
`primary_id` int(11) NOT NULL auto_increment, 
`master_id` int(11) NOT NULL default '0', 
`name` varchar(50) NOT NULL default '', 
PRIMARY KEY (`c_id`), 
KEY `fk_master_id1` (`master_id`), 
CONSTRAINT `fk_master_id1` FOREIGN KEY (`master_id`) REFERENCES `master` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

雖然這一戰略工程充分在大多數情況下,你可能也想看看實現類樹結構的其他策略以及有效查詢它們帶來的挑戰。有關在MySQL中存儲樹狀結構的替代設計的更多信息,請參見SO上的this答案。

+0

謝謝!我會按照你的建議。 – CodingWonders90

+0

怎麼就當我運行查詢我得到的錯誤「#1064 - 你在你的SQL語法錯誤;檢查對應於你的MySQL服務器版本使用附近的「限制ON UPDATE RESTRICT)引擎正確的語法手冊= InnoDB DEFAULT CHARSET = latin1'at line 7「 – CodingWonders90

+1

現在就試試吧。請確保編輯查詢以匹配主表的實際列名稱。 – Jeshurun