2014-03-31 40 views
0

好日子大家,我有一種情況,有一個網站,每個選擇項在一個MySQL表中的記錄上的項目的可選列表:從SQL數據庫添加和/或刪除記錄

parentID BIGINT NOT NULL 
childID BIGINT NOT NULL 

在「的parentID」就是「childID的」屬於,所以數據庫可以包含類似的記錄的ID:

2 | 13 
4 | 8 
4 | 10 
4 | 7 

這表明#4記錄有與它(7相關的三個記錄, 8,10)。現在假設用戶選擇網站列表中的另一項目(例如記錄9),但也取消選擇記錄7,在添加記錄9時刪除記錄7的最佳做法是什麼?我已經看過使用'NOT IN'語句(沒有成功)和'NOT EXIST'語句(但沒有實現),但是我想在這裏要花太多時間在可以做得比做得更好的事情上我自己的設計。

戴夫

+0

我假設我將不得不使用兩個單獨的sql語句,但想知道什麼是獲得結果集以處理每個必需的添加/刪除sql調用的最佳方式。 – user1646428

+0

不知道你在說什麼回合。你的樣本數據中沒有「9」。 「9」是兒童記錄還是父母記錄? –

+0

Marc,記錄9是用戶在示例中選擇的,因此它尚未添加到數據庫中。這表明需要在記錄7需要刪除時添加它。 – user1646428

回答

0

可以寫應用程序邏輯來檢測時,而另一個被添加正刪除一行,並使用與更新查詢修改「已刪除」排進補充說:「」行。但坦率地說,這是明顯的優化被複雜性所掩蓋的情況之一(如果兩行被刪除,但只有一行被添加?或反之亦然?),結果將是不可維護的噩夢。

相反,我會推薦兩個通行證 - 一個是刪除刪除記錄,另一個是插入新通行證。

您的DELETE查詢可能如下所示:DELETE FROM tableName WHERE parentID=4 AND childID NOT IN (8,10,9),其中8,10和9是您的表單傳遞到您的應用程序的記錄ID。您會注意到childID 9在查詢中,但不在數據庫中;這很好,它不會造成任何傷害,並且僅僅是將所有傳遞的ID粘合到一個查詢中這一事實的副作用是最簡單的選擇。 (請注意,這只是一種選擇;另一種選擇是首先選擇現有的childID,然後將其與來自表單的傳入ID的列表進行比較,然後刪除已刪除的ID。)

Your然後,INSERT傳遞將遍歷表單中的傳入ID並插入不在數據庫中的ID。這可能需要SELECT首先查找那裏的ID,然後將其與傳入的數據進行比較,以查找數據庫中尚未存在的ID。我不打算進一步這樣做,因爲它似乎已經有功能邏輯來添加行;但是,如果情況並非如此,我可以進一步闡述。

在這兩種情況下,是絕對一定您消毒的投入,以防止SQL注入!請參閱this question和有關該主題的更多答案。

+0

我正在考慮做兩次通過的方法,但無法弄清楚mySQL語句。我試圖找到以下記錄,但它只是繼續返回0結果: – user1646428

+0

$ included = str_replace(「|」,「,」,$ _POST ['children']); – user1646428

+0

SELECT id FROM tableName WHERE parentID ='「。$ _ POST ['parent']。」'AND childID IN(「。$)「) – user1646428