MYSQL更新表设置列等于从同一表中选择列

时间:2019-06-15 22:05:28

标签: mysql

我的数据库中有一个新列,我需要用特定行中同一列的值来填充它。我想创建一个“全部复制”功能

例如,将相同的价格添加到第一行中获取的所有产品中:

%ld

我正在尝试选择第一行(ID 1)的PRICE,并将其复制到所有其他行。

我尝试过:

ID   NAME   PRICE
1    PROD1    5
2    PROD2    0
3    PROD3    0
4    PROD4    0

我想结束这个

UPDATE PRODUCTS SET PRICE = (select PRICE from PRODUCTS where ID = 1);

但是我得到这个错误:

ID   NAME   PRICE
1    PROD1    5
2    PROD2    5
3    PROD3    5
4    PROD4    5

我尝试分别指定每个表

 Table 'PRODUCTS' is specified twice, 
 both as a target for 'UPDATE' and as a separate source for data

但是我遇到同样的错误。

UPDATE PRODUCTS as a SET a.PRICE = (select b.PRICE from PRODUCTS as b where b.ID = 1);

也许我必须创建一个临时表并从中复制? 关于如何完成此操作的任何提示? 谢谢。

4 个答案:

答案 0 :(得分:1)

您可以通过嵌套选择查询来做到这一点:

UPDATE PRODUCTS 
SET PRICE = (
  select PRICE from (select PRICE from PRODUCTS where ID = 1) t
);

请参见demo
另一种方法是使用自我CROSS JOIN:

UPDATE PRODUCTS p CROSS JOIN (
  select PRICE from PRODUCTS where ID = 1
) t 
SET p.PRICE = t.PRICE;

请参见demo

答案 1 :(得分:0)

这在逻辑上是行不通的,因为SQL会尝试获取要更新的数据。

尝试分别运行嵌套语句select PRICE from PRODUCTS where ID = 1,保存响应,然后运行主语句:"UPDATE PRODUCTS SET PRICE = " + newPrice

答案 2 :(得分:0)

查看了其他帖子和网站上的许多答案之后(没有一个答案是准确的),我找到了该查询的解决方案,是的,我们需要临时表:

CREATE TEMPORARY TABLE tmptable SELECT ID, PRICE FROM PRODUCTS WHERE ID = 1;
UPDATE PRODUCTS SET `PRICE` = (select tmptable.`PRICE` from tmptable where tmptable.ID = 1);

但是! @forpas解决方案非常好,并且无需创建临时表即可工作。

享受。

新问题:临时表是否自动删除?给我留言。 干杯

答案 3 :(得分:0)

如果这是一个SQL脚本,建议您使用一个变量将其分为2个查询:

select @var := PRICE from PRODUCTS where ID = 1;
UPDATE PRODUCTS SET PRICE = @var;

在我看来,变量比临时表容易得多。

我还没有完全测试过,但是语法应该是