1

假设,如果我有 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 行?

我的假设是它会首先删除具有最低主键的行,这是正确的吗?

4

3 回答 3

2

默认情况下,SQL 将删除数据库中从上到下的行,简而言之就是表中​​的前 5 条记录,因此如果需要,可以先使用orORDER BY子句对它们进行排序ASCDESC

于 2013-05-06T05:28:14.667 回答
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 ,您可以确定它是如何工作的。

谢谢

于 2013-05-06T05:25:27.317 回答
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

于 2013-05-06T05:31:24.650 回答