SQL Server 2012中基于DesignID的特殊自定义增量列实现问询
实现依赖DesignID的TaskName自动编号方案
嘿,我懂你想要的效果——TaskName要绑定DesignID,保留重复的.XXX部分,同时靠IDX确保每条记录唯一对吧?之前的代码没达到预期,那我给你两个实用的方案,适配不同的需求场景:
方案一:按DesignID分组自增IDX(同一DesignID下IDX从1开始)
这个方案适合你希望相同DesignID的TaskName序号连续的场景,比如DES001.XXX.1、DES001.XXX.2,换个DesignID就重新从1计数:
- 先建一个辅助表存每个DesignID的当前序号
CREATE TABLE DesignTaskSeq ( DesignID VARCHAR(50) PRIMARY KEY, CurrentIdx INT DEFAULT 1 );
- 创建插入触发器自动生成TaskName
CREATE TRIGGER trg_GenerateTaskName ON TableTask INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; -- 初始化新DesignID的序号(如果是第一次插入该DesignID的记录) MERGE INTO DesignTaskSeq dts USING (SELECT DISTINCT DesignID FROM inserted) i ON dts.DesignID = i.DesignID WHEN NOT MATCHED THEN INSERT (DesignID) VALUES (i.DesignID); -- 生成TaskName并插入主表 INSERT INTO TableTask (DesignID, TaskName, [你的其他列名]) SELECT i.DesignID, CONCAT(i.DesignID, '.XXX.', dts.CurrentIdx), i.[你的其他列名] FROM inserted i JOIN DesignTaskSeq dts ON i.DesignID = dts.DesignID; -- 更新该DesignID的下一个序号 UPDATE dts SET CurrentIdx = CurrentIdx + 1 FROM DesignTaskSeq dts JOIN inserted i ON dts.DesignID = i.DesignID; END;
方案二:全局唯一IDX(所有记录IDX连续递增)
如果你不需要按DesignID分组,只要保证TaskName绝对唯一就行,那这个方案更简单,不用额外建表:
- 给表加一个自增的序号列
ALTER TABLE TableTask ADD TaskIdx INT IDENTITY(1,1) PRIMARY KEY;
- 创建计算列自动生成TaskName
ALTER TABLE TableTask ADD TaskName AS CONCAT(DesignID, '.XXX.', TaskIdx) PERSISTED;
这样每次插入记录时,TaskName会自动生成为DesignID.XXX.1、DesignID.XXX.2...不管DesignID是否重复,IDX都是全局递增的,绝对不会重复。
小提醒
- 如果你的数据库是MySQL,触发器和语法会有点不一样,但核心逻辑是一致的——要么用辅助表存序号,要么用自增列+计算列。
- 如果
.XXX不是固定值,而是需要动态设置,把CONCAT里的.XXX.换成你要的字段或者变量就行。 - 记得保证DesignID字段不为空,不然TaskName会出现空前缀哦。
内容的提问来源于stack exchange,提问作者Secret
相关产品推荐
相关产品推荐

