mysql中删除数据不可以用子查询吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中删除数据不可以用子查询吗?相关的知识,希望对你有一定的参考价值。

select * from one where oneName in (select oneName from one
group by OneName,OneAge,oneSex,oneAddress having count(oneName) > 1 )
用select 可以查询到数据,
delete from one where oneName in (select oneName from one
group by OneName,OneAge,oneSex,oneAddress having count(oneName) > 1 )
用delete总是报错,You can't specify target table 'one' for update in From clause
删除数据为什么不能用子查询?
为什么呢?求大神帮帮忙

不能先select出同一表中的某些值,再update这个表(在同一语句中) 

解决方案

--1.把需要删除的数据放到另外的一张表里
create table table_test as select oneName from one 
 group by OneName,OneAge,oneSex,oneAddress having count(oneName) > 1;
--2.删除不需要的数据
delete from one where onename in(select oneName from table_test);
--3.删除创建的表
drop table table_test;

追问

为什么不能这样使用啊?求大神解释一下,谢谢

追答

mysql所限啊,只能说明mysql不够强大,还需要完善,Oracle能够实现

参考技术A 不可以在查询表的同时操作这张表 mysql所限

您可以从 influxdb 中删除数据吗?

【中文标题】您可以从 influxdb 中删除数据吗?【英文标题】:Can you delete data from influxdb? 【发布时间】:2014-12-03 19:13:02 【问题描述】:

如何从 influxdb 中删除数据?

文档显示它应该很简单:

delete from foo where time < now() -1h

出于某种原因,influxdb 拒绝我的删除语句,说“删除查询不能有不引用时间的 where 子句”

select * from bootstrap where duration > 1000 and time > 14041409940s and time < now()

我想删除这 5 个持续时间 > 1000 秒的条目

这应该是一个有效的 sql 语句,但它失败了

这些删除语句都不起作用

delete from bootstrap where duration > 3000000"

delete from bootstrap where duration > 300000"

delete from bootstrap where time = 1404140994043"

delete from bootstrap where duration > 300000 and time > 1404141054508 "

delete from bootstrap where duration > 300000 and time > 1404141054508s "

delete from bootstrap where time > 1404141054508s and duration > 300000 "

delete from bootstrap where duration > 30000 and time > 1s"

文档参考

https://docs.influxdata.com/influxdb/v2.0/query-data/influxql/

更新

其他查询

delete from bootstrap where time > 1404141416824 and duration > 3000;
delete sequence_number from bootstrap where time > 1s and duration > 1000;

也许这是一个错误?

https://github.com/influxdb/influxdb/issues/975https://github.com/influxdb/influxdb/issues/84

【问题讨论】:

您的查询的问题只有 2。首先,除了时间之外,您不能从任何内容中删除:

从引导程序中删除,其中持续时间 > 3000000

不起作用,并且使用此查询

从 bootstrap 中删除 time > 1404141416824s

你说的是以秒为单位的,但时间是以毫秒为单位的,所以你必须更改为 ms :)

嘿@spuder,接受的答案是错误的。您有机会选择 John Clements 的答案作为正确答案吗? 【参考方案1】:

influx只能按时间删除

例如以下是无效的:

#Wrong
DELETE FROM foo WHERE time < '2014-06-30' and duration > 1000 #Can't delete if where clause has non time entity

这就是我删除数据的方式

DELETE FROM foo WHERE time > '2014-06-30' and time < '2014-06-30 15:16:01'

更新:这适用于 influx 8。据说它不适用于 influx 9

【讨论】:

我也很沮丧地发现 Influxdb 目前只支持基于时间的查询。 对我来说没有意义的是这个查询有时间:DELETE from foo where time = '2014-06-30 12:18:00' 但这不起作用。我确实尝试了时间>时间 是的,我发现influx 在时间上是错误的。你不能指定一个具体的时间,你需要给它一个围绕你想要的日期的范围。 @spuder,我想你可以加个官方链接documentation。我想它可能对正在寻找答案的人有用。 看来你可以在 influxdb 0.9 中做到这一点。例如,这是一个对我来说刚刚成功的查询:“DROP SERIES FROM temperature WHERE machine='zagbar';” (对不起分号,这是一种反射......)【参考方案2】:

看来您可以在 influxdb 0.9 中执行此操作。例如,这里有一个对我来说刚刚成功的查询:

DROP SERIES FROM temperature WHERE machine='zagbar'

(根据@MuratCorlu 的慷慨评论,我将重新发布我之前的评论作为答案......)

【讨论】:

奇怪的是,现在这对我有用(查询略有不同),提示错误“ERR:数据库未打开” 看起来与 github.com/influxdb/influxdb/issues/3087 相关(相同?),并且以类似的方式,我看到虽然我确实收到了错误,但删除确实成功了。 当问题包含时间跨度时,我无法理解如何放弃系列是答案? 在我看来,您可以使用一对 WHERE 子句指定时间跨度,不是吗? (注意:没有尝试过,没有安装 influxDB 的 ATM)。 我不再受雇于与此问题相关的地方,因此无法测试。【参考方案3】:

我很惊讶没有人提到 InfluxDB retention policies 自动删除数据。您可以设置默认保留策略,也可以在每个数据库级别进行设置。

来自the docs:

CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [DEFAULT]

【讨论】:

为避免任何潜在的混淆,这些保留政策链接适用于 InfluxDB 0.9,原始发布者使用的是 InfluxDB 0.8。也就是说,在 InfluxDB 0.9 中,保留策略绝对是删除数据的第一个也是最好的方法,但它们当然必须预先配置。 此外,保留策略仅在设置后删除数据,它们不会删除以前的数据 - 但是,该数据处于不同的保留策略下,并且可以单独删除,因为新旧 RP 的数据会不重叠(除非您故意手动从一个复制到另一个)【参考方案4】:

因为 InfluxDB 对删除有点痛苦,所以我们使用了一个具有名为“ForUse”的布尔字段的架构,当通过线路协议 (v0.9) 发布时看起来像这样:

your_measurement,your_tag=foo ForUse=TRUE,value=123.5 1262304000000000000

您可以使用您发送的任何字段键覆盖相同的测量值、标签键和时间,因此我们通过将“ForUse”设置为 false 并让保留策略控制数据库大小来执行“删除”。

由于无缝覆盖,您也可以追溯添加架构。噪音。

【讨论】:

有志者事竟成。 虽然字段没有被索引,所以这样每个查询都有每个删除条目的成本。这可能有问题,也可能没有问题。 可爱。我从没想过您可以通过使用不同的布尔值插入“新”点来“删除”!太棒了! 这是个好主意,但为什么要使用字段而不是标签呢? @maxpleaner - 我使用字段而不是标签,因为如果我使用标签,它将显示为新条目。例如site=north,cabinet=3,server=2,foruse=Truesite=north,cabinet=3,server=2,foruse=False 将是两个完全不同的记录。【参考方案5】:

我正在添加此命令作为参考,以更改 kubernetes k8s 中 InfluxDB 容器内的保留。使用 wget 是因为容器没有 curl 和 influx CLI

wget 'localhost:8086/query?pretty=true' --post-data="db=k8s;q=ALTER RETENTION POLICY \"default\" on \"k8s\" duration 5h shard duration 4h default" -O-

验证

wget 'localhost:8086/query?pretty=true' --post-data="db=k8s;q=SHOW RETENTION POLICIES" -O-

【讨论】:

【参考方案6】:

你只能用你的时间字段删除,这是一个数字。

Delete from <measurement> where time=123456

会起作用。记住不要给单引号或双引号。它是一个数字。

【讨论】:

这不是真的,你也可以在删除查询中指定标签。【参考方案7】:

已接受的答案(DROP SERIES)适用于许多情况,但如果您需要删除的记录分布在多个时间范围和标签集之间,则无法正常工作。

一种更通用的方法(尽管速度较慢)是使用另一种编程语言逐个发出删除查询。

    查询您需要删除的所有记录(或在脚本中使用一些过滤逻辑)

    对于您要删除的每条记录:

      提取时间和标签集(忽略字段)

      将其格式化为查询,例如

      DELETE FROM "things" WHERE time=123123123 AND tag1='val' AND tag2='val'
      

      一次发送一个查询

【讨论】:

【参考方案8】:

这是 InfluxDB shell 版本:1.8.2

删除也没有时间字段。从一系列屏幕截图中可以看出:

    我创建了一个数据库并添加开始使用它。

    在其中添加一些行。验证是否已添加。

    删除所有带有“Dev1”标签的内容并进行验证。

注意:标签名称只能用单引号括起来。不是双重的。

【讨论】:

【参考方案9】:

运行 influxdb 并选择数据库:

influx -databse '<database-name>'

然后运行查询:

DELETE WHERE time < '2021-04-11 7:00:00'

或者如果你想从特定的measurement删除数据

DELETE FROM <measurement> WHERE time > '2014-06-30' and time < '2021-04-10 15:16:01'

【讨论】:

【参考方案10】:

在 InfluxDB 2 中,不存在像 DROP 这样的 InfluxQL 命令(仅支持 InfluxQL 只读查询)。相反,您需要使用CLI 或REST API。

例子:

influx delete --bucket "MY BUCKET" --predicate '_measurement="MY_MEASUREMENT"' -o "MY ORG" --start '1970-01-01T00:00:00Z' --stop '2025-12-31T23:59:00Z'

【讨论】:

我必须添加令牌字段才能使其工作。

以上是关于mysql中删除数据不可以用子查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的更新语句update中可以用子查询吗?

我还想问下,你知道如何删除mysql或者sqlite3数据库中前面10条的数据吗?是在啥都不知道的情况下删除!

之前上面也装过mysql了,这样有冲突吗?我删除过了,怎么才能知道有没有删除干净了呢?

如何保证多线程从mysql数据库查询的数据不重复

如何清除 MySQL 查询配置文件

MSSQL 中,怎么批量删除 _WA _sys 开头自动创建的索引