当列的值相等时在同一个 MySQL 表上更新行

Posted

技术标签:

【中文标题】当列的值相等时在同一个 MySQL 表上更新行【英文标题】:Updating on the same MySQL table the row when the values of columns are equals 【发布时间】:2018-06-25 04:33:51 【问题描述】:

当列 xIDID 的值相等时,我需要在同一个 mysql 表上更新该行。

这是一个例子:

mysql> SELECT
    Euro,
    ALMACEN,
    Imagen,
    xID,
    ID
FROM
    `tbl_g`
WHERE
    xID IN (2025)
OR ID IN (2025);
+--------+----------+--------+------+------+
| Euro   | ALMACEN  | Imagen | xID  | ID   |
+--------+----------+--------+------+------+
| 7742,8 | ARGUALAS | NULL   | NULL | 2025 |
| NULL   | EMPALME  |        | 2025 | 4441 |
+--------+----------+--------+------+------+
2 rows in set

我尝试了这个 SQL 更新查询但没有成功,因为 xID 编号为 2025 的行没有更新为 ID 2025 的行的值:

mysql> UPDATE `tbl_g` kkk,
 `tbl_g` jjj
SET kkk.Euro = jjj.Euro
WHERE
    kkk.ID = jjj.xID
AND kkk.xID IS NOT NULL;

Query OK, 0 rows affected
Rows matched: 0  Changed: 0  Warnings: 0

如何解决这个问题?

你能帮帮我吗?

提前感谢您的帮助,非常感谢。

【问题讨论】:

【参考方案1】:

使用 JOIN(自联接)更新表并使用 WHERE 子句检查 Euro 列是否为空。

查询

update `tbl_g` as `t1`
join `tbl_g` as `t2`
on `t1`.`xID` = `t2`.`ID`
set `t1`.`Euro` = `t2`.`Euro`
where `t1`.`Euro` is null;

注意:有可能满足条件的多行。

【讨论】:

【参考方案2】:

例如,您需要一个自我加入

drop table if exists t;

create table t(Euro  decimal(10,2) , ALMACEN  varchar(20), Imagen int, xID  int, ID  int);
insert into t values
( 7742.80 , 'ARGUALAS' , NULL   , NULL , 2025),
( NULL    , 'EMPALME'  , null   , 2025 , 4441);

update t t1 join t t2 on t2.xid = t1.id
    set t2.euro = t1.euro;

select * from t;

MariaDB [sandbox]> select * from t;
+---------+----------+--------+------+------+
| Euro    | ALMACEN  | Imagen | xID  | ID   |
+---------+----------+--------+------+------+
| 7742.80 | ARGUALAS |   NULL | NULL | 2025 |
| 7742.80 | EMPALME  |   NULL | 2025 | 4441 |
+---------+----------+--------+------+------+
2 rows in set (0.00 sec)

【讨论】:

以上是关于当列的值相等时在同一个 MySQL 表上更新行的主要内容,如果未能解决你的问题,请参考以下文章

更新时在同一张表上执行触发器

MySQL NULL 值处理

MySQL - 一个表上的行删除不会更新另一表的关系

mysql如何根据一列值更新另一列的值?

MySQL 使用多个条件更新列的值

MySQL:用其他行值计算和更新一行?