1

我的练习是:

演员 HARPO WILLIAMS 意外地以 GROUCHO WILLIAMS 的身份进入了演员表。编写查询以修复记录。

所以我试图通过以下方式查询它:

update actor
 set actor.first_name = 'HARPO'
 where actor_id in (
  select actor.actor_id from actor
  where concat(actor.first_name, ' ', actor.last_name) = 'GROUCHO WILLIAMS'
 );

不幸的是,错误被抛出

您不能在 FORM 子句中指定目标表“演员”进行更新

我该如何解决?

4

3 回答 3

4

您不需要子查询;只需分别匹配 first_name 和 last_name 以获取要更新的行。以下查询还可以利用表(first_name, last_name)上的复合索引(如果已定义)的好处actor

update actor
set actor.first_name = 'HARPO'
where actor.first_name = 'GROUCHO' 
       AND actor.last_name = 'WILLIAMS'
于 2019-09-22T06:28:55.947 回答
0

不要为此使用子查询,您可以使用简单的更新或者像这样,

UPDATE actor AS s, (SELECT id  FROM actor WHERE fname='GROUCHO' AND lname = 'WILLIAMS') AS p
SET s.fname = 'HARPO' 
WHERE s.id = p.id;

DB FIDDLE 链接:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5ceb8e0d5d5837ce2ec13f18bfd103b2

于 2019-09-22T06:40:00.817 回答
0

只需分别匹配名字和姓氏即可更新行。我不认为子查询很重要。

于 2019-09-22T06:40:31.527 回答