假设,如果我有 6 行符合某个标准..
(即,WHERE First = 'Bob' AND Middle = 'J' AND Last = 'Dole'
)
..我做了一个DELETE FROM table WHERE First = 'Bob' AND Middle = 'J' AND Last = 'Dole' LIMIT 5
..
首先删除哪 5 行?
我的假设是它会首先删除具有最低主键的行,这是正确的吗?
默认情况下,SQL 将删除数据库中从上到下的行,简而言之就是表中的前 5 条记录,因此如果需要,可以先使用orORDER BY
子句对它们进行排序ASC
DESC
最好你使用这样的东西
Delete from table where id in
(select id from table where First = 'Bob' AND Middle = 'J'
AND Last = 'Dole' order by id asc)
现在将 asc 更改为 dsc ,您可以确定它是如何工作的。
谢谢
鉴于没有任何ORDER BY
子句(无论如何这与操作几乎无关DELETE
),因此无法准确判断删除行的顺序。
尽管您对最低主键优先的假设 可能听起来有效,但实际顺序可能取决于用于跟踪行的索引,给定WHERE
条件。
您可以真正预测行删除顺序的唯一方法是使用存储过程或用另一种语言编写的程序逐个删除行。该算法将是这样的(尽我所能):
strSQL = "select *
from yourTable
where First = 'Bob' and Middle = 'J' and Last = 'Dole'
order by Id"
rowSet = fetch_query(strSQL)
for each row in rowSet
id = row.get(id)
strSQL = concatenate("delete from yourTable where id=", id)
execute_query(strSQL)
next row
检查参考手册(http://dev.mysql.com/doc/refman/5.1/en/delete.html)后,我发现:
如果
DELETE
语句包含ORDER BY
子句,则按子句指定的顺序删除行。这主要与 结合使用LIMIT
。例如,以下语句查找与WHERE
子句匹配的行,按 对它们进行排序timestamp_column
,并删除第一个(最旧的)行:
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
ORDER BY
在某些情况下,按照避免参照完整性违规所需的顺序删除行也可能很有用。
由此我推断,真正确定删除顺序的唯一方法是ORDER BY
在您的语句中包含一个子句DELETE
。