Php 在多个表中处理/插入Id。(基本论坛)

Php 在多个表中处理/插入Id。(基本论坛),php,mysql,sql,Php,Mysql,Sql,所以我开始写一个论坛,因为我想学习一点SQL MySQL 首先,我有一个posts表,有post\u id和topic\u id列 但是,在另一边,我有一个主题表。 在topics表中,我还有一个last\u post\u id和topic\u id 所以它们是相互参照的 所以问题是:当用户创建一个主题,同时写第一篇文章时,如何有效地插入这些id 因为现在我要做以下步骤: 插入与主题相关的数据主题标题..等等,插入last_post_id=0,因为我不知道这里的值,然后检索主题id 插入帖子数据

所以我开始写一个论坛,因为我想学习一点SQL MySQL

首先,我有一个posts表,有post\u id和topic\u id列

但是,在另一边,我有一个主题表。 在topics表中,我还有一个last\u post\u id和topic\u id

所以它们是相互参照的

所以问题是:当用户创建一个主题,同时写第一篇文章时,如何有效地插入这些id

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

插入与主题相关的数据主题标题..等等,插入last_post_id=0,因为我不知道这里的值,然后检索主题id

插入帖子数据文本、用户名..、主题id,并重设此特定帖子id

更新主题表,将检索到的post\u id设置为last\u post\u id。 是不是太长、太乏味、太没效果了


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

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


关于主题/帖子,正常的过程是创建不存在的主题,获取创建的id,然后插入一篇带有该主题id的新帖子,就像你说的那样。

你可以使用一个事务来完成,但基本思想是一样的。你需要在拥有topic_id之前插入新主题,并且需要在拥有last_post_id之前插入新帖子。对于你当前的表,没有办法解决这个问题

您还可以使用在向帖子添加新记录时自动更新last_post_id字段的。这不会改变执行的查询数量,但MySQL本身会透明地处理查询


此外,mu在回答中将last_post_id设置为NULL时提出的观点太短,这是一个好主意。

您可以使用单个事务来完成,但基本思想是相同的。你需要在拥有topic_id之前插入新主题,并且需要在拥有last_post_id之前插入新帖子。对于你当前的表,没有办法解决这个问题*编辑以添加:您还可以使用在将新记录添加到帖子时自动更新last_post_id字段的。这不会改变执行的查询数量,但MySQL本身会透明地处理它。@MartinodF:你想把它作为一个答案吗?我写的几乎是一样的东西,甚至是扳机!当你发表评论时。@muistooshort我把它作为一个答案发布了出来,可能有点晚了:你关于使用NULL的观点也是一个好主意!是的,听起来很合理。。但是phpBB在topics表中也有最后一个post id:D——正如我看到的数据库结构一样,它并不是毫无意义的。它当然不是标准化的,但它保存了一个查询,比如从主题为X的帖子中选择MAXid。。这是一种权衡,你必须确保你的最后一个帖子id保持正确的最新状态,但它存在的原因是:@MartinodF,如果你将最后一个帖子id存储在主题表中,你仍然需要查询帖子表以获取用户/帖子/日期或任何你想要的内容。如果您改为使用类似select user,date from posts的内容查询post表,其中topic_id=$topic_id order_by date desc limit 1您不会给服务器带来更大的压力,是吗?您可以使用联接在单个查询中获取该信息。选择topics.*,posts.user,posts.date FROM topics内部连接topics上的posts.last_post_id=posts.post_id WHERE topics.topic_id=X。我不是说这是一个更好的解决方案,只是说它是可行的。在决定解决哪一个问题之前,我们应该评估两者的优缺点:我确实同意您可以使用join。这听起来不是一个好的做法,但它对服务器友好。有没有一种方法可以在同一个查询中获取主题和最新帖子,而不存储最新的\u id?我想你必须使用某种mysql循环?我只是把这个留给你,因为我们说的都是同样的事情,你确实是第一个进入的。穆,为什么你要删除?:我刚开始读外键的东西。。我不能在“操作”选项卡下找到已删除的帖子吗??-@谢谢@muistooshort,你真是太好了@关于外键的关键点,如果您使用InnoDB,您应该确保topics.last_post_id声明为引用post.post_id的外键,并且post.topic_id引用topics.topic_id。您可以定义当更新或删除会破坏这些关系时该怎么做,例如,删除某个主题时,删除具有该主题id的所有帖子。一定要阅读外键!