MySQL INSERT时动态生成自增ProductID:Northwind库批量新增产品问题
解决停产产品生成_v2新产品的唯一ProductID问题
针对你遇到的子查询仅执行一次导致ProductID重复的问题,可通过**窗口函数ROW_NUMBER()**实现逐行递增的唯一ID分配,具体SQL如下:
INSERT INTO `products2`( `ProductName`, `ProductID`, `SupplierID`, `CategoryID`, `QuantityPerUnit`, `UnitPrice`, `UnitsInStock`, `UnitsOnOrder`, `ReorderLevel`, `Discontinued` ) SELECT CONCAT(p.ProductName, '_V2'), -- 先取当前最大ProductID,再加上行号实现逐行递增 (SELECT MAX(ProductID) FROM products2) + ROW_NUMBER() OVER (ORDER BY p.ProductID), p.SupplierID, p.CategoryID, 30, p.UnitPrice * 2, 10, 20, 2, 'n' FROM products2 p WHERE p.Discontinued = 'y';
原写法失效原因:
- 语句1用
MAX(ProductID) + p.ProductID,是将原产品ID直接追加到最大ID后,会导致ID跳号甚至重复(若原产品ID存在重复),逻辑不符合需求。 - 语句2中的子查询仅计算一次最大ID并加1,整个SELECT过程中该值固定不变,因此所有新插入行的ID完全相同,必然重复。
新写法逻辑:
(SELECT MAX(ProductID) FROM products2)一次性获取当前表中最大的ProductID;ROW_NUMBER() OVER (ORDER BY p.ProductID)为每个符合条件的停产产品生成从1开始的递增序号;- 两者相加后,新产品ID依次为
最大ID+1、最大ID+2……,确保唯一且连续递增。
内容的提问来源于stack exchange,提问作者zfeld
相关产品推荐
相关产品推荐

