MySQL:类别和子类别的交叉表引用(主、主、名称)?

MySQL:类别和子类别的交叉表引用(主、主、名称)?,mysql,Mysql,我正在创建一个标记为categories的表,其中主类别(父列)包含0,子类别包含父类别的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

我正在创建一个标记为categories的表,其中主类别(父列)包含0,子类别包含父类别的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`)
)

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'),

如果使用InnoDB引擎,则可以强制表的引用完整性。这样,您可以确保从不插入没有匹配父id的类别,在删除父类别时级联删除子类别等。将create语句更改为:

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上的答案。

谢谢!我会听从你的建议。为什么当我运行查询时会出现错误“#1064-您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在第7行“立即尝试”附近使用的“更新限制时限制)引擎=InnoDB DEFAULT CHARSET=latin1”的正确语法。确保编辑查询以匹配主表的实际列名。