2015-06-24 107 views
0

我是SQL的初學者,並且想編寫一個腳本從MySQL數據庫的兩個表中刪除行。SQL通過選擇外鍵刪除行

我有活動和與會者,並希望從90天以前的活動中刪除所有與會者和活動數據。 因此,我需要找到舊事件的event_ids數組,然後刪除所有參與該數組中任何event_id的與會者。

解決這個問題的最好方法是什麼?這裏是我的想法:

DELETE * FROM attendees WHERE event_id = ANY (SELECT id FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY)) 

DELETE * FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY) 
+0

表是用外鍵約束連接的嗎? –

+0

與會者擁有引用事件表主鍵的外鍵event_id。 – Buzzwave

+0

你的想法會起作用,[這裏](http://stackoverflow.com/questions/3331992/how-to-delete-from-multiple-tables-in-mysql)是一個更好的解決方案。你也可以添加一個ON DELETE CASCADE外鍵。 – Vatev

回答

1

刪除查詢不應該使用*

DELETE FROM attendees WHERE event_id = IN (SELECT id FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY)) 


DELETE FROM events WHERE enddate <= DATE_ADD(CURDATE(), INTERVAL -90 DAY) 

(編輯:添加ANY處理子查詢多行)

+0

'錯誤:#1242 - 子查詢返回多於一行' 如何處理子查詢中的數組? – Buzzwave

+0

你有參加者的enddate專欄嗎? –

+0

我更新了我的答案用途,而不是任何 –

0

您應該建立一個外鍵關係從attendeeseventon delete cascade

然後,當您刪除一個事件時,與會者將自動被刪除。

您可以閱讀更多關於外鍵關係here

+0

我還沒有創建數據庫。但是如果這種關係在創建時已經設置並且事件將被刪除(只有我的代碼的第二行),這將意味着與會者也會自動刪除? – Buzzwave

+0

剛剛檢查過,這是一個非常好的方法來做到這一點,[很多](http://www.mysqltutorial.org/mysql-on-delete-cascade/) 不幸的是,這將影響該數據庫上的其他操作我不想影響。 – Buzzwave

+0

@ user2014895。 。 。我發現很難想象你會想要一個'event_id'無效的'參加者'表。保持一致性稱爲關係完整性,維護關係完整性是數據庫的重要功能。 –