【问题标题】:MySQL: Cross table Referencing (primary, master, name) for categories and subcategories?MySQL:类别和子类别的交叉表引用(主,主,名称)?
【发布时间】:2012-05-28 01:12:01
【问题描述】:

我正在创建一个标有类别的表,其中主类别(父列)包含 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'),

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果您使用 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 上的this 答案。

    【讨论】:

    • 谢谢!我会听从你的建议。
    • 我运行查询时怎么会收到错误“#1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,以了解在 ' 附近使用的正确语法RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=latin1' 在第 7 行"
    • 现在就试试吧。确保编辑查询以匹配主表的实际列名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多