如果有多个插入,有没有办法在每次插入时增加值? (我不谈论自动增量的主键)
假设我有这样的结构:
|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做得更好:)
答案 0 :(得分:62)
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'";