You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完全相同,必然重复。

新写法逻辑:

  1. (SELECT MAX(ProductID) FROM products2)一次性获取当前表中最大的ProductID;
  2. ROW_NUMBER() OVER (ORDER BY p.ProductID)为每个符合条件的停产产品生成从1开始的递增序号;
  3. 两者相加后,新产品ID依次为最大ID+1、最大ID+2……,确保唯一且连续递增。

内容的提问来源于stack exchange,提问作者zfeld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:06:15