【发布时间】:2017-01-22 17:54:10
【问题描述】:
我需要创建一个包含增量 id 的表,但我希望根据其他列自动对 id 进行分段。这是我想要的:
CREATE TABLE dbo.MyTable (
myKey INT IDENTITY PRIMARY KEY,
category INT,
incrementalId INT
);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (200);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (100);
INSERT INTO dbo.MyTable (category) VALUES (200);
SELECT *
FROM dbo.MyTable;
我希望它显示如下内容:
myKey category incrementalId
----------- ----------- -------------
1 100 1
2 200 1
3 100 2
4 100 3
5 100 4
6 200 2
意思是我希望incrementalId 每个类别自动递增,并从 1 重新开始插入任何新类别。我希望在表中的任何插入上自行完成(我不想在插入此表时记住这样做)。
我认为这可以通过窗口函数和触发器来完成,但我就是不知道怎么做。
编辑:
如果发生数据删除,我希望保留数据以避免增量 ID 被转移。此外,理想情况下,在删除行的情况下不会重新给出相同的 ID(与序列或 IDENTITY 的工作方式相同)
有什么想法吗?
【问题讨论】:
-
类别是无限的吗?
-
@scsimon 是的,他们可以随时添加。今天有 50 个,下个月可能有 55 个,依此类推。
-
只更新而不是处理插入恕我直言的逻辑可能更快。
-
为什么您认为需要将记录的序号存储在类别中,而不是在查询时即时计算?使用窗口函数时,您是否面临严重的性能下降?
-
@ajeh 我希望保留数据。如果一行被删除,我不希望一个类别中的序列号被移动。
标签: sql sql-server tsql auto-increment