mysql delete的一个问题

mysql> select * from a;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
|    3 | test3 |
|    4 | test3 |
|    5 | test3 |
+------+-------+
5 rows in set (0.00 sec) 

对这样的一个表,需要删除 name相同的记录。id没有要求,但我这里只留下最小的id。

mysql> delete from a where id not in (select min(id) as id from a group by name);
ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause

google查询结构,原来mysql不支持这样的同时有select跟delete/update同一个表的操作。不过可以变通一下:

mysql> delete from a where id not in (select * from (select min(id) as id from a group by name) b where a.id=b.id);
Query OK, 2 rows affected (0.01 sec)

 

当然这样的问题在sqlserver上没有了。

delete from #a where id not in (select min(id) from #aa group by name)

这样完全没有问题。

 

 

 

### MySQL DELETE语句用法及示例 #### 1. 基本语法 `DELETE` 语句用于从表中删除指定的行。其基本语法如下: ```sql DELETE FROM 表名称 WHERE 条件; ``` 此语法表示从指定的表中删除满足条件的行[^1]。 #### 2. 删除单条记录 如果要删除特定的一条记录,可以通过 `WHERE` 子句指定唯一的条件。例如,假设有一个名为 `person` 的表,其中包含字段 `id` 和其他个人信息。可以使用以下 SQL 语句删除 `id=1` 的记录: ```sql DELETE FROM person WHERE id = 1; ``` 这条命令会删除 `person` 表中 `id` 字段等于 1 的那一行数据。 #### 3. 删除多条记录 当需要删除多个符合条件的记录时,可以在 `WHERE` 子句中定义更广泛的匹配条件。例如,删除所有年龄大于 50 的人员记录: ```sql DELETE FROM person WHERE age > 50; ``` 上述查询将移除 `age` 大于 50 的所有行[^2]。 #### 4. 使用 INNER JOIN 进行复杂删除 对于涉及两个或更多表之间的关联关系的情况,可以利用 `JOIN` 结构实现复杂的删除逻辑。下面是一个例子,展示如何基于另一个临时表的内容删除主表中的某些行: ```sql DELETE a FROM tablename AS a LEFT JOIN temp_name AS b ON a.ID = b.ID WHERE b.UserID > 0; ``` 这段代码的作用是从 `tablename` 中删除那些在 `temp_name` 表中有对应 `UserID>0` 关联的记录[^4]。 #### 5. 注意事项 - **谨慎操作**:由于 `DELETE` 操作不可逆,在实际应用前务必确认所使用的过滤条件是否准确无误。 - 如果遗漏了 `WHERE` 子句,则整个表的数据都会被清除掉。因此建议先运行带有相同筛选标准的选择查询 (`SELECT`) 测试影响范围后再正式实施删除动作[^3]。 #### 总结 以上介绍了关于 MySQL 数据库管理系统里执行删除操作的方法及其典型应用场景,并强调了一些重要的安全提示以防止意外丢失重要资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值