MySQL递增值

29 mysql variables

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

让我们说我有这样的结构:

|ID_PRODUCT|ID_CATEGORY|NAME|POSITION|
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO products
( SELECT id_product, id_category, name, MY_POSITION++
  FROM db2.products WHERE id_category = xxx )
Run Code Online (Sandbox Code Playgroud)

因此,应该有一个以1开头的变量MY_POSITION并递增每个插入.

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

Boh*_*ian 64

是:使用用户定义的变量:

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;
Run Code Online (Sandbox Code Playgroud)

递增的结果@position是用于插入的值.


编辑:

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

...
SELECT ..., (@position := ifnull(@position, 0) + 1)
...
Run Code Online (Sandbox Code Playgroud)

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

  • 第二个不起作用,因为未设置对变量的引用,因此它始终设置为 1 (2认同)

nni*_*ols 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;
Run Code Online (Sandbox Code Playgroud)

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