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

如何向数据表中插入按添加顺序生成递加编号的新记录

原脚本失效原因

  • 所有union分支的max(id)、max(price)都是基于插入前的原表数据计算,三个分支得到的id均为5+1=6,price均为1001+1=1002,插入时要么触发主键冲突,要么结果不符合需求。
  • 额外注意:table是SQL保留关键字,作为表名使用时需要用反引号包裹,否则会触发语法错误。

正确实现方案

方案1:支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等通用)

只查询一次原表的最大值,结合ROW_NUMBER生成增量偏移量,一次性计算出所有新记录的字段值:

INSERT INTO `table` (id, name, price)
SELECT 
  base.max_id + ROW_NUMBER() OVER(ORDER BY new.name),
  new.name,
  base.max_price + ROW_NUMBER() OVER(ORDER BY new.name)
FROM (
  SELECT MAX(id) AS max_id, MAX(price) AS max_price FROM `table`
) base
CROSS JOIN (
  SELECT 'ABF' AS name UNION ALL
  SELECT 'ABG' UNION ALL
  SELECT 'ABH'
) new

方案2:兼容旧版本数据库(如MySQL 5.x等不支持窗口函数的场景)

通过用户变量实现偏移量计数:

INSERT INTO `table` (id, name, price)
SELECT 
  base.max_id + @row := @row + 1,
  new.name,
  base.max_price + @row
FROM (
  SELECT MAX(id) AS max_id, MAX(price) AS max_price FROM `table`
) base
CROSS JOIN (
  SELECT 'ABF' AS name UNION ALL
  SELECT 'ABG' UNION ALL
  SELECT 'ABH'
) new
CROSS JOIN (SELECT @row := 0) init_var

内容的提问来源于stack exchange,提问作者Алексей Алексеев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:06:03