MySQL删除限制

时间:2013-07-05 18:48:45

标签: php 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之外,所有news_id都被回应。当select 的相同语句工作时,为什么删除语句有效?

3 个答案:

答案 0 :(得分: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解决了您无法从要删除的同一个表中进行选择的问题。 因为内部SELECT被外部选择封闭,MySQL将结果实现在临时表中,并使用它而不是为每次删除重新运行查询(MySQL不允许)。

答案 1 :(得分:2)

由于limit关键字附近的语法不正确,删除语句无法正常工作... LIMIT 1,18446744073709551615 ... LIMIT与{{1}一起使用时必须跟一个数字}

参考:DELETE MYSQL

只有在SELECT语句中才能有DEELTE子句

参考:SELECT MYSQL

你可以做的是找到你要删除的第一行的course_id,(希望如果表格设置正确并且它是表格和自动增量的主键),请执行以下操作:

LIMIT 1,18446744073709551615

或者这也有效:

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

答案 2 :(得分:0)

您应该找到第一行的ID并执行

DELETE FROM table WHERE id != id_found

或找到您必须删除的ID

DELETE FROM table WHERE id IN (ids_found)