在新行中添加max(value)+1,这可能是个问题吗?

use*_*510 2 sql t-sql sql-server sql-server-2005

在SQL Server表中,我有以下2列:

RowId:主键,numaric,标识列和自动插入.
MailId:非密钥,numaric,非身份和非自动插入.

邮件ID可以是重复的.如果是新的MailId,我将检查max(MailId)+1并将其插入新行,如果重复,则值将作为参数.

逻辑看起来很好,但这是一个问题,我只是考虑(但精确的chacnes是低的)同时可能有两个不同的新MailId请求.这可能导致逻辑错误吗?例如,当代码检查max(MailId)+1为101并且我将其存储在变量中但可能在下一个插入语句之前执行插入表中的新记录.现在表中的max(MailId)+1将是102但变量中的值将是101?

任何建议请我也想控制这个错误机会.

编辑

(我没有使用identity(1,1),因为我还必须在其中传递自定义值)

JNK*_*JNK 6

为什么Identity在SQL Server中已有如此优秀的字段时会使用自定义滚动字段?

只需使用INT Identity (1,1)您的ID字段,每次插入行时它都会自动递增.它还可以比你手动实现的任何东西更好地处理并发性.

编辑:

手动ID值的示例:

SET IDENTITY_INSERT MyTable ON

INSERT INTO MyTable (IdField, Col1, Col2, Col3,...)
VALUES
(1234, 'Col1', 'Col2', 'Col3',...)

SET IDENTITY_INSERT MyTable OFF
Run Code Online (Sandbox Code Playgroud)

您需要包含显式字段列表INSERT.

  • @rajah - 确切地说,如果一个伟大的已经免费存在,不要重新发明轮子. (2认同)
  • @user - 你的用例毫无意义.您将如何允许重复的ID值,但您还希望防止由于重复而导致的错误?任何欺骗都是允许的,或者他们不允许,你需要建立你的业务流程. (2认同)