MySQL递增值

时间:2012-03-09 08:40:09

标签: mysql variables

如果有多个插入,有没有办法在每次插入时增加值? (我不谈论自动增量的主键)

假设我有这样的结构:

|ID_PRODUCT|ID_CATEGORY|NAME|POSITION|

所以我有个别产品ID,每个产品都属于一个类别,在这个类别中有不同的位置。我想做这样的事情:

INSERT INTO products
( SELECT id_product, id_category, name, MY_POSITION++
  FROM db2.products WHERE id_category = xxx )

因此应该有一个以1开头的变量MY_POSITION并逐渐增加每个插入。

使用像php或python这样的脚本语言来完成这一切真的很容易,但我想用SQL做得更好:)

5 个答案:

答案 0 :(得分:62)

是:使用user defined variable

SET @position := 0; -- Define a variable
INSERT INTO products
SELECT id_product, id_category, name, (@position := @position + 1)
FROM db2.products
WHERE id_category = xxx;

增量到@position的结果是用于插入的值。


编辑:

您可以通过在线处理初始值来跳过变量声明:

...
SELECT ..., (@position := ifnull(@position, 0) + 1)
...

使用不允许多个命令(以分号分隔)的驱动程序执行查询时,这可能特别方便。

答案 1 :(得分:5)

您将需要ORDER BY id_category并使用两个用户变量,以便您可以跟踪以前的类别ID -

SET @position := 0;
SET @prev_cat := 0;

INSERT INTO products
SELECT id_product, id_category, name, position
FROM (
    SELECT
        id_product,
        id_category,
        name,
        IF(@prev_cat = id_category, @position := @position + 1, @position := 1) AS position,
        @prev_cat := id_category
    FROM db2.products
    ORDER BY id_category ASC, id_product ASC
) AS tmp;

这将允许您在一个查询中执行所有类别,而不是按类别进行分类。

答案 2 :(得分:3)

纯粹要添加@Bohemians的答案 - 我希望计数器经常重置,这可以这样做:

SELECT *,(@position := IF (@position >= 15,1,@position + 1))

其中15显然是重置前的最大数量。

答案 3 :(得分:2)

尝试使用像这样的子查询设置值

 (SELECT MAX(position) FROM products AS T2)+1

(SELECT MAX(position) FROM products AS T2 WHERE id_category = 'product category')+1

答案 4 :(得分:-1)

希望这会奏效。

update <tbl_name> set <column_name>=<column_name>+1 where <unique_column/s>='1'";