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