如果有多个插入,有没有办法使每个插入值增加值?(我不谈论自动增量的主键)
让我们说我有这样的结构:
|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)
使用不允许多个命令(由分号分隔)的驱动程序执行查询时,这可能特别方便.
您将需要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)
这将允许您在一个查询中执行所有类别,而不是按类别执行.