MYSQL - 在 SELECT 中使用 MAX 或 COUNT 进行 INSERT,并为每个 INSERT 更改 MAX/COUNT

问题描述 投票:0回答:1

我正在使用示例 Northwind DB,并希望为每个停产产品插入一个新产品,并使用附加的“_v2”重命名新产品。问题是我想指定一个新的 ProductID(对于没有 ProductID 作为 autoIncrement 的表)。我怎样才能让它获得最大的 ProductID 编号并递增它。 我试过这个:

INSERT INTO `products2`( `ProductName`, `ProductID`, `SupplierID`, `CategoryID`, `QuantityPerUnit`, `UnitPrice`, `UnitsInStock`, `UnitsOnOrder`, `ReorderLevel`, `Discontinued`)  SELECT CONCAT(p.ProductName, '_V2'), (SELECT MAX(p2.ProductID) FROM products2 p2) + p.ProductID, p.SupplierID, p.CategoryID, 30, p.UnitPrice * 2, 10, 20, 2, 'n'  FROM products2 p  WHERE p.Discontinued = 'y';

问题是它似乎检索了 MAX ProductID 并一遍又一遍地重复使用它,为我的所有新产品提供相同的 MAX + 1 ProductID(我通过删除 ProductID 作为主键来测试它)我什至尝试使用相同的结果:

INSERT INTO `products2`( `ProductName`, `ProductID`, `SupplierID`, `CategoryID`, `QuantityPerUnit`, `UnitPrice`, `UnitsInStock`, `UnitsOnOrder`, `ReorderLevel`, `Discontinued`)  SELECT CONCAT(p.ProductName, '_V2'), (SELECT x.ProductID FROM (SELECT p.ProductID, ROW_NUMBER() OVER( ORDER BY ProductID DESC) AS rank FROM products2 p) AS x WHERE x.rank = 1) +1, p.SupplierID,p.CategoryID, 30, p.UnitPrice * 2, 10, 20, 2, 'n'  FROM products2 p  WHERE p.Discontinued = 'y';

我无法让子查询在每次插入时重新运行

mysql subquery sql-insert
1个回答
0
投票

您可以调整查询,将子查询中的

max(ProductID)
分配给变量,然后在查询中递增变量。

这是您可以用来解决问题的简化方法:

create table product (
id int,
name varchar(20),
discontinued bit(1)
);

insert into product values (1, 'prod1', false), (2, 'prod2', true), (3, 'prod3', true);

insert into product (id, name, discontinued)
select @max:=@max+1 newId, concat(p.name, '_v2') newProd, true as discontinued
  from (select @max:=max(id) from product) mx,
       product p
 where p.discontinued = 1;
 
select * from product;

在这里查看它的工作情况

© www.soinside.com 2019 - 2024. All rights reserved.