Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何从sqlserver获取唯一值_Sql Server 2008_Locking - Fatal编程技术网

Sql server 2008 如何从sqlserver获取唯一值

Sql server 2008 如何从sqlserver获取唯一值,sql-server-2008,locking,Sql Server 2008,Locking,我有一个预先存在的sqlserver表。在其他字段中,它有一个名为ID的标识列(也是主键)和一个RecordNumber列(是必填字段)。RecordNumber列中的int值必须是唯一的。因此,在插入一行之前,我获取ID列的最大值,将其加1,然后插入RecordNumber字段为ID+1的行。问题是,当两个用户同时尝试保存时,他们可能会获得相同的ID值,因此会在RecordNumber字段中保存相同的值。请让我知道如何解决这个问题 感谢您,您可以使用事务概念,使用提交和回滚操作 MSDN上非常

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


感谢您,您可以使用事务概念,使用提交和回滚操作


MSDN上非常有趣的链接:

最简单、最有效的方法是将该列定义为*auto increment*

提及

备选方案#1-自动递增字段 备选方案#2-SequentialID作为默认约束 备选方案#3-NewID作为默认约束 如果是多用户事务,则应使用推荐的示例存储过程
为什么您有一个
ID
字段和一个
RecordNumber
字段?由于ID是PK,这已经被保证是唯一的,并且避免了并发问题。您是否发现任何有用的事务本身并不保证任何事情。在默认读取提交级别,两个事务都可以读取相同的最大值。需要更多关于如何使用它们的详细信息。SQL Server只允许每个表有一个
identity
列。OP已经有一个名为
ID
的标识列,那么这对
RecordNumber
列有什么帮助呢?@MartinSmith没有合适的方法,但还有其他方法。所有的解决方案都取决于为什么需要一个单独的列
CREATE TABLE SampleTable
(
    P_Id int NOT NULL Identity(1,1),
    FirstName varchar(255),
    PRIMARY KEY (P_Id)
)
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]
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