使用MySQL删除行

使用MySQL删除行,mysql,sql,Mysql,Sql,假设,如果我有6行符合某个标准 即,其中First='Bob'和Middle='J'和Last='Dole' …我从表中删除,其中First='Bob'和Middle='J',Last='Dole'限制5 将首先删除哪5行 我的假设是,它会先删除主键最低的行,对吗?最好使用这样的方法 Delete from table where id in (select id from table where First = 'Bob' AND Middle = 'J'

假设,如果我有6行符合某个标准

即,其中First='Bob'和Middle='J'和Last='Dole'

…我从表中删除,其中First='Bob'和Middle='J',Last='Dole'限制5

将首先删除哪5行


我的假设是,它会先删除主键最低的行,对吗?

最好使用这样的方法

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,您可以确定它是如何工作的


谢谢

你最好用这样的东西

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,您可以确定它是如何工作的


谢谢

默认情况下,SQL将从上到下删除数据库中的行,并缩短表中的前5条记录,因此,如果需要,可以先使用ORDER By子句和ASC或DESC对它们进行排序

默认情况下,SQL将从上到下删除数据库中的行,并缩短表中的前5条记录,因此如果需要,您可以首先使用ORDER BY子句和ASC或DESC对它们进行排序。鉴于在删除操作中没有任何ORDER BY子句基本上是不相关的,因此无法准确地判断删除行的顺序

尽管最低主键优先的假设听起来可能有效,但实际顺序可能取决于用于跟踪行的索引(给定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
查看参考手册后,我发现:

如果DELETE语句包含ORDERBY子句,则将按照该子句指定的顺序删除行。这主要与限制一起使用。例如,以下语句查找与WHERE子句匹配的行,按timestamp_列对它们进行排序,并删除第一个最早的行:

从用户为'jcole'的日志中删除 按时间戳排序\u列限制1

在某些情况下,ORDER BY还可以用于按避免引用完整性冲突所需的顺序删除行


由此我推断,真正确定删除顺序的唯一方法是在DELETE语句中包含order BY子句。

鉴于事实上没有任何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
查看参考手册后,我发现:

如果DELETE语句包含ORDERBY子句,则将按照该子句指定的顺序删除行。这主要与限制一起使用。例如,以下语句查找与WHERE子句匹配的行,按timestamp_列对它们进行排序,并删除第一个最早的行:

从用户为'jcole'的日志中删除 按时间戳排序\u列限制1

在某些情况下,ORDER BY还可以用于按避免引用完整性冲突所需的顺序删除行


由此我推断,真正确定删除顺序的唯一方法是在DELETE语句中包含ORDERBY子句。

Cool!不幸的是,我已经使用上面发布的SQL运行了脚本,我只是想弄清楚剩余的记录是id最高的记录还是id最低的记录。在将来,我肯定会这样做。我不认为这会强制执行任何删除操作的命令。。。just是过滤数据的另一种方法,我认为效率更低,因为在某些情况下,服务器会强制为tableCool中的每一行运行一次子查询!不幸的是,我已经使用上面发布的SQL运行了脚本,我只是想弄清楚剩余的记录是id最高的记录还是id最低的记录。在将来,我肯定会这样做。我不认为这会强制执行任何删除操作的命令。。。just是另一种过滤数据的方法,我认为效率更低,因为在强制服务器从上到下为表中的每一行运行一次子查询的情况下,您的意思是默认情况下它使用DESC?@cream,除非并且直到您没有指定搜索条件,否则它将从dbI中删除前5个。我很困惑,前5个将按ASC顺序排列,从上到下的措辞意味着DESC,您能澄清一下吗?@cream SQL默认情况下不会在ASC或DESC中对记录进行排序,它也可能是随机的,您需要使用ASC或DESC指定所需的条件,I

我不确定,所以我创建了一个包含记录的表并删除了它,没有使用ORDER BY子句,它从一开始就删除了前5条记录。应该明确的是:在非DBMS特定的SQL中,默认情况下,行没有顺序,如果没有顺序,前5行的概念就变得非常特定于实现。如果需要订单,请指定它。MySQL可能会定义顺序,但如果你想要一个特定的顺序,最好自己指定一个顺序。从上到下,你的意思是默认情况下它使用DESC?@cream,除非并且直到你没有指定搜索条件,否则它会从dbI中删除前5个。我很困惑,前5个将按ASC顺序进行,自上而下的措辞暗示了DESC,你能澄清一下吗?@cream SQL默认情况下不会在ASC或DESC中对记录进行排序,它也可能是随机的,你需要使用ASC或DESC指定需要的条件,我不确定,所以我制作了一个包含记录的表并删除了,而没有使用ORDER by子句,它从一开始就删除了前5条记录。应该弄清楚:在非DBMS特定的SQL中,默认情况下,行没有顺序——如果没有顺序,前5行的概念就变得非常特定于实现。如果需要订单,请指定它。MySQL可能会定义顺序,但是如果你想要一个特定的顺序,最好自己指定一个顺序。。。但我想问:你为什么关心删除行的顺序?您正在删除所有行anyway@Barranka如果有6行并且我在查询中添加了一个LiMIT 5子句,这还会删除所有行吗?我已经编辑了我的答案,以涵盖这种方法:因为确实无法预测默认的删除顺序,所以应该使用order by指定顺序,然后,如果需要,使用limit删除前n行您的问题很有趣。。。但我想问:你为什么关心删除行的顺序?您正在删除所有行anyway@Barranka如果有6行并且我在查询中添加了一个LiMIT 5子句,这还会删除所有行吗?我已经编辑了我的答案,以涵盖这种方法:因为确实无法预测默认的删除顺序,所以应该使用order by指定顺序,然后,如果需要,使用limit删除前n行这是我正在做的,我只是在初始查询中没有使用“orderby”。我使用的是PHP.orderby,当与LIMIT结合使用时,它实际上非常有用。将两者结合起来,从表中删除,其中First='Bob'…etc ORDER BY id LIMIT 5将删除id最低的5条记录。这可能是在删除查询中使用ORDER BY最有用的结果,也是允许使用ORDER BY的主要原因。这就是我正在做的,我只是在初始查询中没有使用“ORDER BY”。我使用的是PHP.orderby,当与LIMIT结合使用时,它实际上非常有用。将两者结合起来,从表中删除,其中First='Bob'…etc ORDER BY id LIMIT 5将删除id最低的5条记录。这可能是在delete查询中说出orderby的唯一最有用的结果,也是允许使用它的主要原因。