从表中删除多行(SQL)

时间:2017-10-21 20:58:15

标签: mysql sql sql-delete delete-row

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

示例:从啤酒(名称,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');

并测试代码。根据讲座,它应该删除啤酒中的所有元组,但是,代码不能正常工作并且不断显示 “当我在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);

但我仍然不知道为什么我们需要使用select两次内存。有人可以解释这段代码的工作原理吗?

1 个答案:

答案 0 :(得分:2)

在更新/删除期间的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