MySQL如何设置列来引用另一个表中的列

时间:2009-12-18 15:30:33

标签: mysql

我想在tableA中定义columnA的值,以获得tableB中tableB.columnB的所有行的计数

我有两张桌子:

articles table
columns: articleId,numComments
comments table
columns: articleId,content

我希望表“articles”中的numComments列包含表注释中所有行的计数articles.articleId=comments.articleId

我是否需要将其中任何一个设为“innodb”?

2 个答案:

答案 0 :(得分:7)

  

我是否需要将其中任何一个设为“innodb”?

是的! InnoDB是唯一支持外键的mysql引擎。您必须执行以下操作:

ALTER TABLE comments ADD CONSTRAINT
        FOREIGN KEY (articleId)
        REFERENCES articles(articleId);

或者如果您只是创建表格:

CREATE TABLE comments
    (articleId INT,
     content INT,
        FOREIGN KEY (articleId)
        REFERENCES articles(articleId);
        ON DELETE CASCADE // You probably want the comments to be deleted,
                          // whenever the article is deleted
    ) ENGINE=INNODB;

请参阅:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

对于numComments列:最好做一个

SELECT count(articleId) FROM comments WHERE articleId=selectedArticleId;

答案 1 :(得分:3)

您可以使用基于两个表格的视图定义计算列,但是此恕我直言不是您想要完成的内容的良好设计选择。如果这个或将成为包含许多文章和更多注释的大表,那么计算注释表中的行将很快成为性能问题。

我可能会创建一个article_comments_count表,但您可以将文章表中的numComments列定义为数字。然后,创建一个存储过程,在记录表中插入记录,并相应地更新articles表中的numComments列。限制对comments表的访问,以便所有插入,更新和删除都必须通过stored_procs,以便可以更新numComments值。这种更新方法还允许您以后添加其他功能,而无需更改应用程序代码。在您的场景中,我可以看到添加某种白/黑列表,在插入注释之前将对其进行检查。