2012-02-26 76 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