2010-02-28 46 views
3
刪除

我有以下表,在我的數據庫中的這些鍵:MySQL的從3個表

預訂 SESSION_ID

會議 SESSION_ID COURSE_ID

課程 COURSE_ID

我想創建一個查詢來刪除與單個課程有關的所有日期(course_id)。例如,如果我想刪除course_id = 10,我想要刪除course_id = 10的任何會話,此外,任何與這些會話相關的任何預訂都需要刪除。

這可能嗎?接近它的最好方法是什麼? (我正在用PHP寫這篇文章。)

任何幫助非常感謝!

+0

不會話表引用自身與SESSION_ID關鍵? – 2010-02-28 19:13:27

回答

4

MySQL supports multi-table deletes

DELETE FROM BOOKINGS 
USING BOOKINGS JOIN SESSIONS JOIN COURSES 
WHERE BOOKINGS.session_id = SESSIONS.session_id 
    AND SESSIONS.course_id = COURSES.course_id 
    AND COURSES.course_id = ? 

另一種替代方法是使用stored procedure,並以正確的順序處理所述缺失:

  1. BOOKINGS

    DELETE FROM BOOKINGS 
    WHERE EXISTS(SELECT NULL 
           FROM SESSIONS s 
           WHERE s.session_id = session_id 
           AND s.course_id = ?) 
    
  2. SESSIONS

    DELETE FROM SESSIONS 
    WHERE EXISTS(SELECT NULL 
           FROM COURSES c 
           WHERE c.course_id = course_id 
           AND c.course_id = ?) 
    
  3. 課程

    DELETE FROM COURSES 
    WHERE course_id = ? 
    
+0

我建議的解決方案除了取決於使用InnoDB引擎之外還有什麼缺點?另外,這是鑰匙的_id。 – 2010-02-28 19:17:17

+1

@Adriano Varoli廣場:「DELETE ON CASCADE」不是一種推薦的做法,因爲其他人不一定知道它已經到位並最終抹去他們不應該擁有的數據。雖然看起來更多的工作,明確正在做什麼是最好的方法。 – 2010-02-28 19:43:16

+0

您好, 感謝您的答覆,我試圖用第一多刪除方法: DELETE FROM預訂,會議,課程中使用JOIN預訂會議JOIN課程WHERE bookings.session_id = sessions.session_id和會話。COURSE_ID = courses.course_id AND courses.course_id =「13」 這似乎並不奏效 - 是我的語法是否正確? - 謝謝! – Fred 2010-02-28 19:47:22

3

我認爲最好的辦法是配置加入適量的外鍵的表(你必須使用InnoDB這實際上在MySQL的工作),並設置FKS爲「ON DELETE CASCADE」的行爲。這樣,當您從課程表中刪除某些內容時,相關的預訂和會話將自動刪除。

一些linksies: