mysql - 从表中删除多行 (SQL)

标签 mysql sql sql-delete delete-row

当我学习数据库系统的讲座时,我尝试了讲座幻灯片中提供的代码,但没有工作。该示例是从表中删除一些元组。

示例:从 Beers(name, manf) 中删除同一制造商生产的另一种啤酒的所有啤酒。 幻灯片中提供的代码如下:

DELETE FROM Beers b  
WHERE EXISTS(    
   SELECT name  
   FROM Beers  
   WHERE manf = b.manf AND name <> b.name);

我创建 Beers 表并插入两行,如下所示:

create table Beers(
    name CHAR(30) primary key,
    manf CHAR(30)
);

insert into Beers(name, manf)
values('Bud', 'A-B');

insert into Beers
values('Bud-lite', 'A-B');

并测试代码。根据讲座,它应该删除 Beers 中的所有元组,但是,代码不起作用并一直显示 “当我在 SQL 上运行删除操作时,您无法在 FROM 子句中指定要更新的目标表“Beers”。

谁能告诉我代码有什么问题吗?谢谢!

添加注释: 发现MySQL无法运行前面的代码,但是可以运行这个:

Delete from Beers
where exists(
  select a.name from(select b.name from Beers b
                     where manf = b.manf AND name!= b.name) as a);

但是我还是不知道为什么我们需要在exists里面使用两次select。有人可以解释一下这段代码是如何工作的吗?

最佳答案

在 mysql 中,更新/删除期间您不能使用同一个表,或者您可以使用 JOIN 执行相同的操作

DELETE a
FROM Beers a
JOIN Beers b ON a.manf = b.manf 
AND a.name <> b.name
/* WHERE a.manf = 'A-B' is not necessary */ 

DEMO

关于mysql - 从表中删除多行 (SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46868007/

相关文章:

sql - 在 MS SQL 中查找序列中缺失的数字

mysql - 在 MySQL 中创建临时列

mysql - 错误 1005 (HY000) : Can't create table "x" (errno: -1)

mysql - 无法删除 MySQL 表

php - 加载数据文件的子查询

mysql - 尝试从一个表中删除另一个表中存在的记录

mysql - 如何编写触发器以在 MYSQL 中中止删除?

MySQL - 删除多个条件

mysql - mysql中如何从另一个存储过程调用一个存储过程?

php - 从表中选择类型为 int 和 varchar 的所有列