MYSQL:更新现有列中的所有值

时间:2014-08-07 21:03:08

标签: mysql database insert

我有一个看起来像这样的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);

然而这不起作用。

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;

Demo

如果您需要更多数字,请查看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;