基于复合主键自动递增列

时间:2018-06-28 10:23:49

标签: sql tsql

假设我有A,B和C列。其中A,B和C组成了主键(复合键)。我想发生的事情是,每当我在A / B上执行插入操作时,C列应仅针对该特定组合而增加一。

基本上,C将跟踪A / B组合的版本。在一起,所有枚举仍然应该都是唯一的。

这是我希望表格在插入后的样子:

  • [A] _ [B] _ [C] _
  • Foo酒吧1
  • Foo Bar 2
  • 巴兹巴兹1
  • Foo酒吧3
  • Bar Baz 2
  • Foo Foo 1

我基本上想要基于A / B组的1种子。

关于如何实现此目标的任何想法?我想我需要一个触发器,然后计算A / B列当前C的最大值?

2 个答案:

答案 0 :(得分:1)

在大多数情况下,这是不值得的。保证序列号是相当复杂的-如果考虑到更新和删除,则更是如此。

另一种方法是使用一个标识列作为表的主键。然后,如果您需要一个序列号,则可以使用:

select a, b, row_number() over (partition by a, b, order by table_id) as c

如果您真的想创建这样一个数字,则需要一个insert触发器来进行计算-并锁定整个表,以防其他操作插入相同的a / {{ 1}}值。您还需要bupdate的触发器。

答案 1 :(得分:0)

您需要一个触发器。像这样:

CREATE TRIGGER [dbo].[tAI_AB]
   ON  [dbo].[AB]
   AFTER INSERT
AS
   DECLARE @A INT;
   DECLARE @B INT;
   DECLARE @C INT;
BEGIN
SET NOCOUNT ON;
   Set @A = (Select A from inserted);
   Set @B = (Select B from inserted);
   Set @C= (Select isnull(Max(C), 0) From AB where A=@A and B=@B);

   UPDATE AB Set C = @C+1 WHERE A=@A and B=@B and C is null;
END

只需更改为适当的A和B类型以及列/表名称即可。