[MySQL]如何刪除關聯式資料?

戰Dreamweaver CS4互動網站百寶箱--使用PHP
http://www.e-happy.com.tw/indexbookshow.asp?bid=175
一書的第十章網站部落格程式,有讀者問到如何在刪除分類時,可以一併刪除分類中的文章,再一併刪除每一篇文章的留言呢?

我們在書上第10-43~10-45頁有達到刪除分類時,一併刪除分類中的文章,但是沒有刪除每一篇文章的留言。在過去PHP的開發方式中,其實這個完成的方式有其一定的困難度,原因是如果要刪除每一篇文章的留言,要利用迴圈先調出每一篇文章刪除留言後,再刪除文章,再刪除分類!

不過在MySQL5支援關聯式資料庫的 foregin key 功能後,這個刪除關聯式資料庫的動作就可以不用寫程式,直接由MySQL資料庫中設定即可達成,以下是茶米完整的說明:

一、了解目前問題的所在

原來資料庫的關聯

原來的資料庫中的規劃,是由 blogcategory 分類資料表以 ca_id 與 blogmessages 文章資料表關聯,而 blogmessages 文章資料表以 blog_id 再與 blogcomments 資料表關聯。
那目前的問題不在於刪除 blogcategory 中的資料時再刪除關聯的 blogmessages 中的資料,也不在於刪除 blogmessages 時再刪除 blogcomments 中關聯的資料,而是刪除 blogcategory 時一併刪除 blogmessages 中關聯的資料,也一併刪除 blogcomments 中的資料。

二、設定MySQL資料庫的 foregin key

茶米先不說些深的大道理,你一定會問:支援 foregin key 的資料庫有什麼好處?其實以目前的範例來說,它的好處就是可以維持資料庫的完整性,再白話一點的意思,就是如果有關鍵的資料表,在 A 中刪除了一筆資料,B 裡相關的資料就會一併被刪除!所以設定 foregin key 即可完成我們目前這個範例的需求。

MySQL 的資料表如果要支援 foregin key 有幾個要點:

  1. MySQL 的版本要在 5.1.X 以上 (好像啦.....)
  2. 資料庫的類型必須是 innoDB

我們書上的範例,剛好都符合這二個要點喔!所以可以馬上著手!以下我們就要教您如何在 phpMyAdmin 中設定資料表之間的 foregin key。

  1. 進入phpMyAdmin 之後,我們要由關聯最底層的 blogcomments 留言資料表的 blog_id (此欄為 foregin key) 與 blogmessage 的主索引 blog_id 設定關聯並建立資料的完整性。
  2. 要注意的是,要建立 foregin key 的欄位必須要建立索引,方式如下,這裡以 blogcomments 留言資料表的 blog_id為例 :

  3. 接著要建立 blogcomments 留言資料表的 blog_id (此欄為 foregin key) 與 blogmessage 的主索引 blog_id 設定關聯並建立資料的完整性。


    當關聯父資料表的主鍵紀錄行被刪除或修改時,InnoDB 對子資料表中紀錄行的處理方式:
    CASCADE - 會將有所關聯的紀錄行也會進行刪除或修改。
    SET NULL - 會將有所關聯的紀錄行設定成 NULL。
    NO ACTION - 有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
    RESTRICT - 與 NO ACTION 相同。 
  4. 接著要往上一層,建立 blogmessages 文章資料表的 ca_id 為 foregin key 與 blogcategory 的 ca_id 建立關聯並設定資料完整性:



如此即完成關聯的設定!

三、測試設定完的結果

接著回到範例,現在其實不修改程式,因為剛才資料庫的修改,也能達到刪除一個分類,就能刪除該分類的文章及每篇文章的留言。

但是為了讓讀者能更清楚看到結果,請開啟 到原始碼,這個頁面中加入 2 個刪除指令,用來刪除 blogcategory 的分類以及 blogmessages 的文章,現在我們要將刪除 blogmessages 的動作拿掉,只刪除 blogcategory 的分類,看資料庫會不會自動刪除其他 2 個資料表中的資料。

  1. 請將刪除 blogmessages 文章的程式 mark 起來: 

  2. 存檔後我們來檢視結果,我們可以看到這個分類除了有文章,每篇文章還有留言:

  3. 進入管理界面後我們刪除這個分類:

  4. 我們進入 phpMyAdmin 來審視結果:


測試的結果,相關資料表中的相關記錄果然都自動刪除了!是不是很神奇呢?快點試看看吧!

 

原文出處:
http://www.dreamweaver.com.tw/?fid=2&viewtopic=31056

 

[好書推薦]挑戰Dreamweaver CS4互動網站百寶箱:使用PHP

內容簡介

立即體驗Dreamweaver CS4 在互動網站與資料庫使用的傑出表現,製作出與眾不同、功能強大的互動網站!

本書堅持文淵閣 「挑戰」 系列叢書一貫之理念-向上提升、向下紮根,帶領您體驗Dreamweaver CS4 在互動網站與資料庫使用上的傑出表現。書中將利用一個個實用的範例詳細說明 Dreamweaver CS4 使用 PHP 語法在互動網站的實務應用,絕對讓您在實際的操作中,製作出與眾不同、功能強大的互動網站!

獨家內容:

影音教學檔:提供 4~12 章之範例實作教學影片,邊看邊學,大幅提昇學習效果。

流程圖:透過精心繪製的流程圖說明,更能了解程式的運作方式。

程式資料表:程式基本資料表中整理了設定的細節,操作範例時將更為方便。

擴充程式:提供17個強大的擴充程式,瞬間提升作品層次,在單純設定中完成複雜操作與程式碼的編寫。

概念篇

第 01 章 互動網站的織夢高手
認識這個世界占有率極高的網頁編輯軟體,並介紹互動網站的原理與優勢。

第 02 章 打造互動網站的運作環境
全面而深入說明在製作互動網站前的準備動作與伺服器安裝。

第 03 章 MySQL 資料庫的使用與互動網站的定義
詳細介紹 MySQL 資料庫的安裝設定,並利用 phpMyAdmin 進行管理的方式,進而說明在網頁中連結資料庫的方式,引導讀者感受互動網站的境界。

基礎篇

第 04 章 新聞公告系統的製作
使用 Dreamweaver 開發一個完整的新聞公告系統,在這個範例中充份練習互動網頁製作的基本技巧。

第 05 章 網站留言版的製作
網站留言版與新聞系統不同之處在於網站的內容並不是由管理者建置,而是一般瀏覽者留言,所以在過濾及檢查留言內容時就十分重要。

應用篇

第 06 章 網站計數器及線上人數的製作
網站計數器的製作重點在於統計資料庫中的資料,再由程式繫結顯示在頁面上。線上人數的製作重點在於使用檔案做為記錄標的,利用程式進行檔案寫入的動作。

第 07 章 線上郵寄程式的製作
線上郵寄程式是目前互動網站中相當重要的功能,製作重點在於 SMTP 伺服器的使用與程式碼的互動。

第 08 章 網站會員系統的製作
會員系統在互動網站中有著十分重要的地位,會員的收集與資料使用,對於網站經營有舉足輕重的影響。會員程式的困難除了由資料庫中記錄登入者的資料外,還必須依照其權限管理會員可以使用的功能與頁面。

進階篇

第 09 章 網路相簿程式的製作
隨著數位相機的流行,藉由網站相簿與他人分享的風氣也越來越盛。在網站相簿的設計上,最重要的是使用程式上傳檔案及管理檔案的動作。

第 10 章 網站部落格程式的製作
部落格程式開發時除了注重關聯式資料庫的加入,主題與時間分類方式更加強了程式的應用彈性,收集回應並共同營造內容,加強人與人之間的互動。

第 11 章 互動討論區的製作
討論區是完全以主題為排序的依據,除了發表主題,也可回應其他主題參與討論。討論區十分重視關聯式資料庫的使用,也會應用到較進階的查詢統計動作。

第 12 章 購物車程式的製作
購物車程式的重點在於使用 Session 或是 Cookie 陣列的技術將商品加入虛擬的資料表中,在結帳時再記入真實的資料庫中。

目錄

CH01 互動網站的織夢高手 Dreamweaver CS4
CH02 打造互動網站的運作環境
CH03 MySQL 資料庫的使用與互動網站的定義
CH04 新聞公告系統的製作
CH05 網站留言版的製作
CH06 網站計數器及線上人數的製作
CH07 線上郵寄程式的製作
CH08 網站會員系統的製作
CH09 網路相簿程式的製作
CH10 網站部落格系統的製作
CH11 互動討論區的製作
CH12 購物車程式的製作

線上試讀:http://www.books.com.tw/exep/assp.php/yogo/exep/prod/lookinside.php?item=0010458055


相關資訊:http://www.books.com.tw/exep/assp.php/yogo/exep/prod/booksfile.php?item=0010458055

延伸閱讀:
挑戰Dreamweaver CS4互動網站百寶箱--使用PHP
挑戰PHP5/MySQL程式設計樂活學
[好書推薦]世界第一簡單資料庫
[PHP]如何讓一週內的新聞顯示New圖示?

如果覺得這篇文章對您有所幫助,在觀看完文章之餘,希望能點選下方方廣告,當作是對YOGO的支持,讓YOGO更有寫作的動力。

留言

::Crux::寫道…
Hi Yogo
感謝您的分享喔

這個網誌中的熱門文章

用PHP寄MAIL的方法

ImageMagick應用大全(一)

php安裝openssl的方法