1

我试图弄清楚如何更新一个表中的一行,将列值设置为另一个表中的值。这是一个例子:

movies:

movie_id | movie_price

movies_attended:

attended_id | attended_movie_id | attended_movie_price

现在,这是一个愚蠢的例子,但假设由于某种原因,movies_attended 中有一行没有正确的attended_movies_price,因此需要更新。

应该如何编写查询来更新movies_attended 表,设置movies_attended.attended_movie_price = movies.movi​​e_price?

我尝试了类似以下的方法,但没有奏效:

update movies_attended, movies 
set movies_attended.attended_movie_price = movies.movie_price 
where movies_attended.attended_movie_id = movies.movie_id 
AND attended_id = [the id of the row we want to update]
4

2 回答 2

3

当您说“它不起作用”时,您的意思是它报告了 0 行更新,还是该语句导致数据库引发异常?

您的示例语句似乎是以下形式:

UPDATE movies_attended a
  JOIN movies m
    ON a.attended_movie_id = m.movie_id
   SET a.attended_movie_price = m.movie_price
 WHERE a.attended_id = ?

(我们通常更喜欢JOIN ... ON ...样式语法,而不是逗号连接运算符和 WHERE 子句中的连接谓词。)

我无法解释为什么该声明“不起作用”。

如果没有行满足谓词,这可能会报告 0 行受影响。如果要更改的行不需要任何更改,它还将报告 0 行受影响......也就是说,现有值attended_movie_price已经与分配给它的值匹配。

通常,在运行这样的更新语句之前,我先将其编写为 SELECT,然后查看返回的值......

通过用 替换UPDATE关键字SELECT ... FROM并删除SET子句:

SELECT m.movie_price          AS new_val
     , a.attended_movie_price AS old_val
     , a.attended_id
  FROM UPDATE movies_attended a
  JOIN movies m
    ON a.attended_movie_id = m.movie_id
 WHERE a.attended_id = ?
于 2012-09-13T18:01:19.590 回答
0

这实际上是一个糟糕的数据库设计。您不需要两张表中的电影价格。

但是,如果你只需要这个,它会这样:

UPDATE movies_attended
INNER JOIN
movies
ON movies_attended.attended_movie_id = movies.movie_id
SET movies_attended.attended_movie_price = movie.movie_price
于 2012-09-13T17:54:44.603 回答