2009-10-17 119 views
0

我正試圖製作一個最小化冗餘數據的實驗性Web應用程序。 我已成立了像這樣三個示例表:PHP MySQL將數據插入到多個表中

Table one 
ID | created_at (unix timestamp) | updated_at (unix timestamp) 

Table two 
ID | Foreign Key to table one | Title 

Table three (pages) 
ID | Foreign Keys to both table one and two | Content | Metadata 

的想法是,在應用程序中創建的一切都會有一個創建/編輯時間。

很多(但不是全部)的東西都會有一個標題(例如一個頁面或一個頁面的部分)。最後,有些東西將具有特定於自己的屬性,例如頁面的內容和元數據。

我試圖找出將數據輸入到多個表的最佳方法。我知道我可以從PHP執行多個插入查詢,跟蹤當前事務中創建的行,並在事務的後期部分失敗時刪除這些行。但是,如果PHP腳本完全死亡,則可能會在所有刪除操作完成之前停止。

MySQL是否有任何允許插入查詢被拆分的內置邏輯?觸發器能夠處理這種類型的事務,還是超出了它的能力?

任何意見,想法或想法將不勝感激。

謝謝!

+0

您意識到,當用戶將標題更改爲2+次時,您無法確定哪個是原始的?頁面變得越來越糟......它也會人爲地誇大你的數據,存儲檔案版本 - 這是可以的,假設你想支持恢復到以前的版本。 – 2009-10-17 18:54:23

回答

6

解決方案將使用Transactions,它允許獲得「全部或全部」行爲。

的想法是這樣的:

  • 你開始交易
  • 你做你的插入/更新
  • ,如果一切正常,您提交事務;這將節省您在此次交易中所做的一切
  • 如果不是,則回滾事務;你在其中做的所有事情都將被取消。
  • 如果您沒有提交併斷開連接(如果您的PHP腳本死亡,例如),則不會提交任何內容,並且您在未提交的事務期間所做的操作將自動回滾。

欲瞭解更多信息,你可以看看12.4.1. START TRANSACTION, COMMIT, and ROLLBACK Syntax,MySQL的。


注意交易僅適用於某些DB引擎:

  • MyISAM不支持事務
  • InnoDB確實(它也支持外鍵,例如 - 它更先進那MyISAM)
1

對於多個插入,您可以創建一個過程,並在PHP上調用該過程。