我有一个看起来像这样的mysql表:
> +-------+-------+-------+--------+---------------+-------------+
> | score | likes | views | orders | image_ratings | part_number |
> +-------+-------+-------+--------+---------------+-------------+
> | 0 | 2 | 0 | 0 | 0 | 1030-507629 |
> | 0 | 1 | 0 | 0 | 0 | 1070-B265A |
> | 0 | 2 | 0 | 0 | 0 | 1070-B26UY |
> +-------+-------+-------+--------+---------------+-------------+
我想用值1,2,3(分别)更新所有分数,所以它看起来像这样:
> +-------+-------+-------+--------+---------------+-------------+
> | score | likes | views | orders | image_ratings | part_number |
> +-------+-------+-------+--------+---------------+-------------+
> | 1 | 2 | 0 | 0 | 0 | 1030-507629 |
> | 2 | 1 | 0 | 0 | 0 | 1070-B265A |
> | 3 | 2 | 0 | 0 | 0 | 1070-B26UY |
> +-------+-------+-------+--------+---------------+-------------+
我想在一个声明中执行此更新,但不知道如何。我在想
UPDATE table1 SET score = (1,2,3);
然而这不起作用。
答案 0 :(得分:1)
您可以使用此复合查询执行此操作:
SET @a := 0;
UPDATE example2 e3 INNER JOIN (
-- part to generate the numbers from 1 to 3
-- could easily adapted to your needs
SELECT N, e2.A, e2.part_number FROM (
SELECT 1 as N UNION ALL SELECT 2 UNION ALL SELECT 3
) as n
INNER JOIN (
SELECT
@a := @a + 1 as A,
e.*
FROM
example2 e
) as e2
ON
n.N = e2.A
) t
ON
e3.part_number = t.part_number
SET
e3.score = t.A;
如果您需要更多数字,请查看this answer
答案 1 :(得分:1)
我怀疑这是您打算做的事情,但如果您希望在分数列中添加一组递增值,则可以使用以下语句执行此操作:
ALTER TABLE table1 ADD COLUMN `temp` int key auto_increment;
UPDATE table1 SET score = temp;
ALTER TABLE table1 DROP COLUMN temp;
如果您只是尝试为不是基于其他列值的多行更新一列,而是使用应用程序中的值更新,则需要创建多个查询。 MYSQL需要知道要影响哪些列,并且它不能仅依赖于它们存储在表中的顺序而没有任何其他值。
如果您尝试在一个查询中执行此操作以保持与数据的一致性,我建议您使用“START TRANSACTION”;'在您的更新集之前,检查每个更新是否成功,然后运行' COMMIT;'最后。
答案 2 :(得分:1)
试试这个:
SET @i = 0;
UPDATE table1 SET score = @i:=@i+1;