将唯一int插入非主键字段

时间:2014-11-05 12:55:15

标签: sql sql-server tsql insert-into

我正在尝试使用INSERT INTO进行SQL查询以从表中复制多个行,但我希望其中一个字段(不是主键)具有新的唯一int(我知道这是一个糟糕的数据库设计,但我无法改变数据库的结构。)

以下是我正在尝试做的简化示例:

    INSERT INTO Mytable
        (field1
        ,field2
        ,field3
        ,nonKeyUniqueInt)

    SELECT
        (field1
        ,field2
        ,field3
        ,(SELECT MAX(nonKeyUniqueInt)+1 FROM mytable)
    FROM
        mytable
    WHERE
        (conditions)

但是这不起作用,因为SELECT MAX查询只运行一次,为我的所有新行提供该字段的相同值。给定以下要复制的行:

field1 field2 field3 nonKeyUniqueInt
x      y      z      1
a      b      c      2

我得到的输出:

field1 field2 field3 nonKeyUniqueInt
x      y      z      1
a      b      c      2
x      y      z      3
a      b      c      3

我正在尝试做什么?

1 个答案:

答案 0 :(得分:2)

问题是子查询对insert进行一次评估,而不是每行评估一次。解决方案是使用row_number()

INSERT INTO Mytable(field1, field2, field3, nonKeyUniqueInt)
    SELECT field1, field2, field3,
           x.maxk + row_number() over (order by (select NULL))
    FROM mytable CROSS JOIN
         (SELECT MAX(nonKeyUniqueInt) as maxk FROM mytable) x
    WHERE (conditions);

我将最大计算移动到FROM子句,以明确它只被评估一次。