我正在使用示例 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';
我无法让子查询在每次插入时重新运行
您可以调整查询,将子查询中的
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;