mariadb MySql UPDATE多个值

qlckcl4x  于 2022-12-13  发布在  Mysql
关注(0)|答案(2)|浏览(149)

我想更新我所有用户的sort_id。例如,因为有10个用户,我想分别指定sort_id从0到9。我可以在PHP中使用foreach来完成这一操作,但它会导致很多性能和时间问题。有没有一种方法可以做到这一点,而无需再次运行每个更新查询?

UPDATE users SET sort_id=LAST_INSERT_ID(sort_id)+1 WHERE id IN(100,101,102,103,104)

我真正想做的是

#id - #sort_id
100, 0
101, 1
102, 2
103, 3
104, 4
7ajki6be

7ajki6be1#

我不知道为什么要存储冗余数据,这些数据可以通过同一个表中另一列的值计算出来。数据冗余会导致数据异常和损坏,在关系数据库系统中应该始终避免。
如果只在客户端需要sort_id,只需使用简单的select。

SELECT id, RANK() OVER (ORDER BY ID) - 1 as sort_id
FROM users WHERE id BETWEEN 100 and 104

如果确实要存储sort_id,请使用带有子查询得UPDATE:

UPDATE users AS u JOIN 
 (SELECT id, RANK() OVER (ORDER BY id) - 1 AS sort_id
  FROM users WHERE id BETWEEN 100 AND 104) as s
ON u.id=s.id SET u.sort_id=s.sort_id
flseospp

flseospp2#

您可以使用row_number()函数:

UPDATE users u
SET sort_id = t.rn
FROM (
    SELECT id, ROW_NUMBER() OVER(ORDER BY id) rn
    FROM users
) t
WHERE t.id = u.id

子查询为行分配一个序号,然后使用该序号更新sort_id列.

相关问题