我有以下表,在我的數據庫中的這些鍵:MySQL的從3個表
預訂 SESSION_ID
會議 SESSION_ID COURSE_ID
課程 COURSE_ID
我想創建一個查詢來刪除與單個課程有關的所有日期(course_id)。例如,如果我想刪除course_id = 10,我想要刪除course_id = 10的任何會話,此外,任何與這些會話相關的任何預訂都需要刪除。
這可能嗎?接近它的最好方法是什麼? (我正在用PHP寫這篇文章。)
任何幫助非常感謝!
我有以下表,在我的數據庫中的這些鍵:MySQL的從3個表
預訂 SESSION_ID
會議 SESSION_ID COURSE_ID
課程 COURSE_ID
我想創建一個查詢來刪除與單個課程有關的所有日期(course_id)。例如,如果我想刪除course_id = 10,我想要刪除course_id = 10的任何會話,此外,任何與這些會話相關的任何預訂都需要刪除。
這可能嗎?接近它的最好方法是什麼? (我正在用PHP寫這篇文章。)
任何幫助非常感謝!
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,並以正確的順序處理所述缺失:
BOOKINGS
DELETE FROM BOOKINGS
WHERE EXISTS(SELECT NULL
FROM SESSIONS s
WHERE s.session_id = session_id
AND s.course_id = ?)
SESSIONS
DELETE FROM SESSIONS
WHERE EXISTS(SELECT NULL
FROM COURSES c
WHERE c.course_id = course_id
AND c.course_id = ?)
課程
DELETE FROM COURSES
WHERE course_id = ?
我建議的解決方案除了取決於使用InnoDB引擎之外還有什麼缺點?另外,這是鑰匙的_id。 – 2010-02-28 19:17:17
@Adriano Varoli廣場:「DELETE ON CASCADE」不是一種推薦的做法,因爲其他人不一定知道它已經到位並最終抹去他們不應該擁有的數據。雖然看起來更多的工作,明確正在做什麼是最好的方法。 – 2010-02-28 19:43:16
您好, 感謝您的答覆,我試圖用第一多刪除方法: 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
我認爲最好的辦法是配置加入適量的外鍵的表(你必須使用InnoDB這實際上在MySQL的工作),並設置FKS爲「ON DELETE CASCADE」的行爲。這樣,當您從課程表中刪除某些內容時,相關的預訂和會話將自動刪除。
一些linksies:
不會話表引用自身與SESSION_ID關鍵? – 2010-02-28 19:13:27