2012-02-26 73 views
0

于是我开始写一个论坛,因为我想学习一点SQL(MySQL)。ID处理/插入多个表。 (基础论坛)

所以,首先我有一个帖子表,并有post_idtopic_id列。

但是,在另一边我有一个主题表。 在主题表我也有last_post_idtopic_id

所以他们互相参考。

所以问题是:当用户创建一个话题(同时写第一篇文章)时,如何INSERT这些id有效?

因为现在我要做以下步骤:

  1. 插入话题相关的数据(主题title..etc,插入last_post_id = 0,因为我不知道这里这个值),然后检索topic_id

  2. 插入后的数据(文本,用户名..,topic_id),并retieve这个特殊的POST_ID

  3. 更新主题表,检索到的post_id(设置为last_post_id)。

它不是太长,乏味,无效..?

谢谢你的时间。我的英语不是最好的.. sry。

+0

你可以使用单个事务来完成,但基本的想法是一样的。您需要在拥有topic_id之前插入新主题,并且您需要在拥有last_post_id之前插入新帖子。用你目前的表格,这是没有办法的。 *编辑添加:你也可以使用['TRIGGER'](http://dev.mysql.com/doc/refman/5。6/en/triggers.html),当新记录被添加到'posts'时,它会自动更新'last_post_id'字段。这并不会改变执行的查询数量,但它将由MySQL本身透明地处理。 – MartinodF 2012-02-26 23:32:03

+0

@MartinodF:你想把它作为答案吗?当你发表评论时,我正在写几乎相同的东西(即使是触发器!)。 – 2012-02-26 23:36:41

+0

@ muistooshort我已经发布它作为一个答案,也许晚了一点:)也许你关于使用NULL的观点也是一个好主意! – MartinodF 2012-02-26 23:40:19

回答

2

你可以用一个事务来完成,但基本的想法是一样的。您需要在拥有topic_id之前插入新主题,并且您需要在拥有last_post_id之前插入新帖子。用你目前的表格,这是没有办法的。

您也可以使用TRIGGER,当posts添加新记录时,它会自动更新last_post_id字段。这并不会改变执行的查询数量,但它将由MySQL本身透明地处理。

另外,由mu提出的问题太短,他在回答关于将last_post_id设置为NULL时是一个好主意。

+0

我只是把这个给你,因为我们说的是同样的事情,你真的先得到了。 – 2012-02-26 23:48:26

+0

亩,为什么你删除? :))我刚刚开始阅读外键thingy ..我无法找到您的操作选项卡下删除的帖子?? - @MartinodF谢谢:) – Filkor 2012-02-26 23:52:51

+0

谢谢@ muistooshort,非常友善! @CriticalPoint关于外键,如果你使用的是InnoDB,你应该确保'topics.last_post_id'被声明为引用'post.post_id'的外键,并且'post.topic_id'引用'topics.topic_id'。您可以定义在UPDATE或DELETE中断这些关系时要执行的操作,例如删除该主题时使用某个'topic_id'删除所有帖子。请务必阅读外键! – MartinodF 2012-02-26 23:58:28

0

last_post_id是无意义的,只是额外的工作。相反,您应该在需要时动态抓取特定主题的最后一篇文章。没有理由将其存储在数据库中。

关于主题/帖子,正常程序是在主题不存在的情况下创建主题,抓取创建的主题标识并插入带有该主题标识的新帖子,就像您说的那样。

+0

是的,听起来很合理..但是phpBB在主题表中也有last_post_id:D - 正如我看到的数据库结构 – Filkor 2012-02-26 23:39:55

+0

这并不意味着什么。它当然不是标准化的,但它保存了一个查询(类似于'SELECT MAX(id)FROM posts WHERE topic_id = X'。)。这是一个折衷,你必须确保你的'last_post_id'保持正确的最新,但它有一个理由:) – MartinodF 2012-02-26 23:42:47

+0

@MartinodF,如果你在主题表中存储last_post_id,你仍然需要查询发布表以获取用户/帖子/日期或任何你想得到的。如果您改为使用'select user'查询帖子表,那么topic_id = $ topic_id order_by date desc limit 1'的帖子的日期不会给服务器带来更大的压力,对吧? – joakimdahlstrom 2012-02-26 23:55:43