MSSQL只有在某些情况下才能自动增加列

时间:2017-01-17 20:04:35

标签: sql-server conditional auto-increment

我有一个包含4列ID,c1,c2和LOT的表。 ID是主键。对于c1为5时的每条记录,我想为LOT自动生成一个数字,对于c2的每个不同值,它将是从1开始的序列。

因此,如果c1不是5,则LOT保持为空。但是如果c1是5那么对于c2 = 1的每个记录,我想用从1开始的自动递增序列填充LOT。 例如:

ID  c1  c2  LOT
1   3   
2   5   1   1
3   5   1   2
4   5   1   3
5   4

然后对c2的不同值执行相同操作。因此,如果c2为2,则从1开始有另一堆自动递增的LOT数字:

ID  c1  c2  LOT
6   3   
7   5   2   1
8   5   1   4
9   5   2   2
10  5   2   3

我们正在使用MSSQL 2014 Enterprise Ed。表分区是否有用,或者我是否需要为C2的每个不同值创建特殊表?

4 个答案:

答案 0 :(得分:1)

没有身份字段,您可以使用触发器。

答案 1 :(得分:1)

使用身份功能无法做到这一点,但是,请考虑使用Instead of trigger手动管理您想要的值。

答案 2 :(得分:0)

您可以使用逻辑在查询或视图中生成LOT:

SELECT ID, C1, C2,
    CASE
        WHEN C1<>5 OR C2 IS NULL THEN NULL
        ELSE COUNT(*) OVER (PARTITION BY C1, C2 ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    END AS LOT
 FROM D
 ORDER BY ID

给定一个用(ID,C1,C2)生成的表:

CREATE TABLE D (ID INT PRIMARY KEY IDENTITY, C1 INT, C2 INT)
INSERT D VALUES (3,NULL),
                (5,1),
                (5,1),
                (5,1),
                (4,NULL),
                (3,NULL),
                (5,2),
                (5,1),
                (5,2),
                (5,2)

查询产生上面指出的输出:

ID  C1  C2  LOT
1   3   
2   5   1   1
3   5   1   2
4   5   1   3
5   4   
6   3   
7   5   2   1
8   5   1   4
9   5   2   2
10  5   2   3

用于生成LOTCOUNT(*) OVER (PARTITION BY C1, C2 ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW的语句只计算在C1和C2等于当前行的当前行之前和之后的行数。例如,对于第4行,元组(c1,c2)=(5,1)在3行(包括该行)(第2,3和4行)中被观察到,因此LOT = 3。

答案 3 :(得分:0)

感谢大家提出使用触发器的建议(全部投票)。事实证明(正如我在上面的评论中提到的),侧栏上出现的文章(SQL Server unique auto-increment column in the context of another column)显示了正确的INSTEAD OF INSERT触发器的详细构造。作者提到它是“未经测试”,确实存在轻微错误(WITH子句中缺少GROUP BY ParentEntityID)但是任何复制代码的人都会得到一个明显需要修复的错误。可能不会犹豫在这里纠正这个帖子,但另一个问题是6岁。