2013-07-05 141 views
3

這看起來很簡單,但是它失敗了。我想要做的就是使用下面的代碼刪除除第一行以外的所有內容。MySQL刪除限制

$sql = "DELETE FROM ".TABLE_PREFIX."news WHERE course_id = $course_id LIMIT 1,18446744073709551615"; 
$result = mysql_query($sql, $db); 

如果我這樣做...

$sql = "SELECT news_id FROM ".TABLE_PREFIX."news WHERE course_id = $course_id LIMIT 1,18446744073709551615"; 
$result = mysql_query($sql, $db); 
while ($row = mysql_fetch_assoc($result)) { 
    echo $row['news_id'] . '<br>'; 
} 

所有news_ids都回蕩除了第一個。爲什麼刪除語句不是工作時選擇相同的語句工作?

+1

什麼決定了第一行是什麼? – ApplePie

+0

另外,在DELETE語句中,這不是正確的LIMIT語法 - 您只需要包含一個用於刪除最大行數的整數:http://dev.mysql.com/doc/refman/5.0/en/delete .html – andrewsi

+0

「LIMIT 1,18446744073709551615」部分應該是跳過第一行,然後刪除其他所有內容。我從這裏得到了這個主意:http://stackoverflow.com/questions/2827029/mysql-skip-first-10-results – gtilflm

回答

1

因爲限制關鍵字附近的不正確的語法的DELETE語句不工作......你不能這樣做LIMIT 1,18446744073709551615 ... LIMIT必須跟一個數字當用於DEELTE

參考:DELETE MYSQL

只有在SELECT語句能不能讓LIMIT 1,18446744073709551615條款

參考:SELECT MYSQL

什你可以做的另一種方法是找到你想要刪除的第一行的course_id(希望如果表格設置正確,並且它是表格和自動增量的主鍵),請執行如下操作:

$sql = "DELETE FROM ".TABLE_PREFIX."news 
     WHERE course_id >=".COURSE_ID_YOU_WANT_DELETED."; 

還是這個工程,以及:

$sql = "DELETE FROM ".TABLE_PREFIX."news 
     WHERE course_id !=".COURSE_ID_YOU_WANT."; 
+0

這些示例不等於OP的代碼。而且也不排除除第一行之外的所有內容。 – Johan

+0

我可以通過首先選擇「第一個」news_id來看到這個工作,正如我在上面的評論中所述。我會暫緩選擇這個答案,直到其他人有機會回覆。謝謝! – gtilflm

+0

@Johan這不是怎麼回事? –

0

你應該在第一行的ID,做一個

DELETE FROM table WHERE id != id_found 

或找到你要刪除的ID和

DELETE FROM table WHERE id IN (ids_found) 
4

贊@Sabashan說DELETE語句中的LIMIT只允許一個參數。

如果你要排除的第1行,使用類似:

DELETE FROM tnews WHERE course_id = $course_id 
AND primary_key NOT IN 
(SELECT * FROM (
SELECT primary_key FROM tnews ORDER BY something LIMIT 1 OFFSET 0)) 

內部的選擇拿起記錄排除。 外部SELECT解決了無法從要刪除的同一個表中選擇的問題。 由於內部SELECT被外層選擇包圍,因此MySQL將結果物化爲臨時表,並使用它來代替爲每次刪除重新運行查詢(MySQL不允許)。

+0

我試圖實現這一點,但它不工作。我有 '$ sql =「DELETE FROM」.TABLE_PREFIX。「news WHERE course_id = $ course_id AND primary_key NOT IN(SELECT * FROM(SELECT primary_key FROM」.TABLE_PREFIX。「news ORDER BY news_id LIMIT 1 OFFSET 0))」 ; \t $ result = mysql_query($ sql,$ db);' 想法? – gtilflm

+0

您需要將您的pk包含的任何字段名稱替換爲'primary_key'佔位符。如果真的有這樣一個關鍵字,我會按照慣例將它寫成大寫字母。 – Johan