使用唯一键INSERT + SELECT

时间:2013-01-09 22:29:14

标签: sql-server

以下T-SQL语句不起作用,因为[key]必须是唯一的,并且MAX语句中的SELECT调用似乎只被调用一次。换句话说,它只是递增键值一次并尝试反复插入该值。有没有人有解决方案?

INSERT INTO [searchOC].[dbo].[searchTable]
([key],
 dataVaultType,
 dataVaultKey,
 searchTerm)
SELECT (SELECT MAX([key]) + 1 FROM [searchOC].[dbo].[searchTable]) AS [key]
  ,'PERSON' as dataVaultType
  ,[student_id] as dataVaultKey
  ,[email] as searchTerm
FROM [JACOB].[myoc4Data].[dbo].[users]
WHERE [email] != '' AND [active] = '1'
AND [student_id] IN (SELECT [userID] FROM [JACOB].[myoc4Data].[dbo].[userRoles] 
WHERE ([role] = 'STUDENT' OR [role] = 'FACUTLY' OR [role] = 'STAFF'))

1 个答案:

答案 0 :(得分:1)

如果您可以使密钥列成为可能最简单的IDENTITY列。这允许SQL Server生成增量值。

或者,如果您确定要找到自己生成密钥的方法,那么我上个月撰写的博客文章可能有所帮助。虽然它使用复合键,但它向您展示了如何通过在单个INSERT语句中插入多行来安全地为每个新行生成新值来解决问题,并且它在许多同时写入器中也是安全的(许多示例)不要处理)

http://colinmackay.co.uk/2012/12/29/composite-primary-keys-including-identity-like-column/

顺便提一下,你在SELECT中每一行获得相同的MAX(Key)值的原因是这是在读取表时发生的。因此,对于SELECT语句返回的所有行,MAX(键)将始终相同。除非为任何SELECT语句添加某种GROUP BY子句,否则任何MAX(columnName)函数都将为返回的每一行返回相同的值。

此外,所有聚合函数都是确定性的,因此对于每个等效的输入集,它将始终具有相同的输出。因此,如果您的密钥集是1,5,9,那么它将始终返回9.