【问题标题】:How best to populate a subordinate numeric key [duplicate]如何最好地填充从属数字键[重复]
【发布时间】:2019-11-25 09:54:53
【问题描述】:

我有两个表:Items 和 Defects。

每个缺陷都与一个(并且只有一个)项目有关。

Items 的 PK 是一个标识列 (ItemID),它在 Defects 中显示为 FK 列,用于关联两个表。

缺陷的 PK 是一个标识列 (DefectID)。

不过,Defects 中还有一个名为 RefNo 的从属数字键,它必须由 每个 ItemID 的序列号填充,因此:

缺陷

DefectID   ItemID    RefNo
1          1         1 
2          1         2
3          1         3
4          2         1
5          2         2
6          3         1
7          4         1
8          3         2
9          1         4

填充 Ref 列的最佳方法是什么?

目前我继承的代码在前端完成了这个,这显然是一个坏主意。

我开始编写插入触发器 (SQL Server 2008-R2),但想知道原子性和调用触发器时可能更新多行的需要 - 以及不同用户尝试同时插入的可能性插入相同的 RefNo。

[编辑]

我正在维护一个现有的数据库并删除 RefNo 列并用动态计算的值重新调整它不是一种选择。

【问题讨论】:

    标签: sql-server sql-server-2008-r2


    【解决方案1】:

    您可以使用如下的 ROW_NUMBER 来生成您的 refno-

    WITH your_table(DefectID,ItemID,RefNo)
    AS
    (
    SELECT 1,1,1 UNION ALL
    SELECT 2,1,2 UNION ALL
    SELECT 3,1,3 UNION ALL
    SELECT 4,2,1 UNION ALL
    SELECT 5,2,2 UNION ALL
    SELECT 6,3,1 UNION ALL
    SELECT 7,4,1 UNION ALL
    SELECT 8,3,2 UNION ALL
    SELECT 9,1,4
    )
    
    SELECT *, 
    ROW_NUMBER() OVER (PARTITION BY ItemID ORDER BY DefectID) AS RefNo_new
    FROM your_table
    order by 2,1
    

    输出-

    DefectID    ItemID  RefNo   RefNo_new
    1           1       1       1
    2           1       2       2
    3           1       3       3
    9           1       4       4
    4           2       1       1
    5           2       2       2
    6           3       1       1
    8           3       2       2
    7           4       1       1
    

    【讨论】:

    • 我不清楚你在这里的建议。您是说不需要整个列,因为它可以动态生成吗?如果是这样,那并不能真正回答我的问题,因为我需要修改现有数据库,并且不能删除该列。我会修改我的问题来说明这一点。或者您是否建议我可以使用它来计算下一个要添加到 RefNo 列中的数字?如果有,怎么做?
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多