Py学习  »  DATABASE

mysql update table set column等于从同一个表中选择列

multimediaxp • 4 年前 • 929 次点击  

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

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

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

我试图选择第一行(id 1)的价格并将其复制到所有其他行。

我试过:

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);

但我也犯了同样的错误。

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

也许我需要创建一个临时表并从中复制? 有什么关于如何做到这一点的提示吗? 谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47977
 
929 次点击  
文章 [ 4 ]  |  最新文章 4 年前
multimediaxp
Reply   •   1 楼
multimediaxp    4 年前

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

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解决方案非常好,而且不需要创建临时表。

享受吧。

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

salvatore
Reply   •   2 楼
salvatore    4 年前

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

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

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

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

blenderfreaky
Reply   •   3 楼
blenderfreaky    4 年前

这在逻辑上是行不通的,因为sql会试图获取它正在更新的数据。

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

forpas
Reply   •   4 楼
forpas    4 年前

可以通过嵌套select查询来完成此操作:

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

demo 是的。
另一种方法是使用自交叉连接:

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

demo 是的。