假设,如果我有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行?
我的假设是它会首先删除主键最低的行,这是正确的吗?
答案 0 :(得分:1)
最好使用类似的东西
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,您可以确定它是如何工作的。
感谢
答案 1 :(得分:1)
默认情况下,SQL会在数据库中从上到下删除行,并在表格中输入前5条记录,因此,如果需要,可以先使用ORDER BY
子句对ASC
或{进行排序> {1}}
答案 2 :(得分:1)
鉴于没有任何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
子句。