如何从sqlserver获取唯一值

时间:2012-08-26 18:26:30

标签: sql-server-2008 locking

我有一个预先存在的sqlserver表。在其他字段中,它具有称为ID的标识列,其也是主键,而RecordNumber列是必需字段。 RecordNumber列中的int值必须是唯一的。因此,在插入行之前,我获取ID列的最大值,向其添加1,然后插入具有RecordNumber字段= ID + 1的行。问题是当两个用户同时尝试保存时,他们可能会获取相同的ID值,因此将在RecordNumber字段中保存相同的值。请让我知道如何解决这个问题。

由于

3 个答案:

答案 0 :(得分:1)

最简单有效的方法是将该列定义为* 自动增量*

参考

http://www.w3schools.com/sql/sql_autoincrement.asp

答案 1 :(得分:0)

您可以使用“提交”和“回滚”操作来使用“事务”概念。

MSDN上非常有趣的链接:http://msdn.microsoft.com/en-gb/library/ms190295.aspx

答案 2 :(得分:0)

备选方案#1 - 自动增加字段

CREATE TABLE SampleTable
(
    P_Id int NOT NULL Identity(1,1),
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)

备选#2 - SequentialID作为默认约束

CREATE TABLE SampleTable
(
    P_Id uniqueidentifier NOT NULL,
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)
ALTER TABLE [dbo].[SampleTable] 
ADD CONSTRAINT [DF_SampleTable_P_Id]  
DEFAULT newsequentialid() FOR [P_Id]

备选方案#3 - NewID作为默认约束

CREATE TABLE SampleTable
(
    P_Id Varchar(100) NOT NULL,
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)
ALTER TABLE [dbo].[SampleTable] 
ADD  CONSTRAINT [DF_SampleTable_P_Id]  
DEFAULT (newid()) FOR [P_Id]

在多用户交易

的情况下,应使用建议的存储过程示例
BEGIN TRY
    SET NOCOUNT ON
    SET XACT_ABORT ON
    Begin TRAN
        --Your Code
    COMMIT TRAN
END TRY

BEGIN CATCH
    ROLLBACK TRAN
END CATCH