【问题标题】:Automatically increment column based on composite primary key基于复合主键自动增加列
【发布时间】:2018-06-28 10:23:48
【问题描述】:

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

本质上,C 将跟踪 A/B 组合的版本。总之,所有的 enries 都应该是独一无二的。

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

  • [A]_ [B]_ [C]_
  • 美食吧 1
  • 美食吧 2
  • 酒吧巴兹 1
  • 美食吧 3
  • 酒吧巴兹 2
  • Foo Foo 1

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

知道如何实现这一目标吗?我想我需要一个排序触发器,然后计算 A/B 列当前 C 的最大值?

【问题讨论】:

  • 是的,这样的触发器可能会有所帮助。
  • 不要尝试在数据操作(INSERT /DELETE /UPDATE)时强制连续编号。只需让 sql-server 对其进行自动编号并在 SELECT 处使用 ROW_NUMBER() OVER()。

标签: sql tsql


【解决方案1】:

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

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

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

如果您真的想创建这样的数字,则需要一个 insert 触发器来执行计算 - 并锁定整个表,以防另一个操作插入相同的 a/b 值。您还需要updates 和deletes 的触发器。

【讨论】:

    【解决方案2】:

    为此,您需要一个触发器。比如:

    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 类型以及列/表名称即可。

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2015-06-08
      • 2017-10-14
      • 2012-02-15
      相关资源
      最近更新 更多