插入一个唯一的int到非主键字段
我想使用INSERT INTO从表中复制一些行的SQL查询,但我想要一个字段(这不是主键)有一个新的,独特的,int(我知道这是可怕的数据库设计,但我不能改变数据库的结构)。插入一个唯一的int到非主键字段
这里是什么,我试图做一个简单的例子:
INSERT INTO Mytable
(field1
,field2
,field3
,nonKeyUniqueInt)
SELECT
(field1
,field2
,field3
,(SELECT MAX(nonKeyUniqueInt)+1 FROM mytable)
FROM
mytable
WHERE
(conditions)
然而,这并不工作,因为SELECT MAX查询只运行一次,给我的所有新行了,同样的价值领域。鉴于以下行来复制:
field1field2field3nonKeyUniqueInt x y z 1 a b c 2
我得到的输出:
field1field2field3nonKeyUniqueInt x y z 1 a b c 2 x y z 3 a b c 3
正是我试图做可能吗?
问题是该子查询获得一次评估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
条款作出明确表示,它是只计算一次。
我认为你的SELECT中的x应该是x.maxk – 2014-11-05 13:12:50
@AndyNichols。 。 。谢谢。 – 2014-11-05 13:13:55
谢谢,它在我的例子中完美。但是,当我试图将它放入真正的数据库时,出现错误“Subquery返回了超过1个值”。我看不出它是如何做到的!哦,我相信我会解决它的。 – Slappywag 2014-11-05 14:10:19
注意:'SELECT MAX(...)+ n'通常不会很好地表现出并发性。怎么样像['SEQUENCE'](http://msdn.microsoft.com/en-us/library/ff878091.aspx)?或者你不想维护一个全局对象? – 2014-11-05 13:23:51
@ Clockwork-Muse你可能是对的,但它基本上是一次性的查询,我想以最简单的方式来完成。 – Slappywag 2014-11-05 14:14:10