我想在tableA中定义columnA的值,以获得tableB中tableB.columnB的所有行的计数
我有两张桌子:
articles table
columns: articleId,numComments
comments table
columns: articleId,content
我希望表“articles”中的numComments列包含表注释中所有行的计数articles.articleId=comments.articleId
我是否需要将其中任何一个设为“innodb”?
答案 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值。这种更新方法还允许您以后添加其他功能,而无需更改应用程序代码。在您的场景中,我可以看到添加某种白/黑列表,在插入注释之前将对其进行检查。