如何在不使用IDENTITY的情况下自动增加列?

Str*_*ior 10 sql-server

我正在创建一个包含两列的表,我想自动增加.一列是主键,因此我在其上使用IDENTITY关键字.另一列将用于跟踪表中用户定义的项目"排序顺序".每当用户移动项目时,其"排序顺序"将交换值与另一个元素的值.但是,当项目插入表格时,应始终自动为插入的项目分配高于表格中任何其他值的排序顺序值.这是表创建脚本的简化版本:

CREATE TABLE [AnswerRow] (
    [AnswerRowId] [int] IDENTITY(1,1) NOT NULL,
    [SortOrder] [int] NOT NULL,
    [IsDeleted] [bit] NOT NULL CONSTRAINT [DF_AnswerRow_IsDeleted] DEFAULT 0,
    CONSTRAINT [PK_AnswerRow] PRIMARY KEY CLUSTERED ([AnswerRowId] asc)
)
Run Code Online (Sandbox Code Playgroud)

使SortOrder列自动递增的最佳方法是什么AnswerRowId(但仍然能够在之后修改排序顺序值)?

Jef*_*ata 10

我不确定这是否是@Stephen Wrighton的想法,但我认为你可以使用插入触发器来利用为AnswerRowId生成的IDENTITY值:

CREATE TRIGGER [dbo].[AnswerRowInsertTrigger]
   ON  [dbo].[AnswerRow]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    UPDATE a SET a.SortOrder = a.AnswerRowId
    FROM AnswerRow a JOIN inserted i ON a.AnswerRowId = i.AnswerRowId

END
Run Code Online (Sandbox Code Playgroud)


Ste*_*ton 5

我想到了两种方式,第一种是触发器,这不是我个人所做的.

第二个,就是让我的SQL在这些方面做点什么:

INSERT INTO AnswerRow(SortOrder, IsDeleted, Answer)
SELECT MAX(SortOrder) + 1, 0, 'My New Answer'
FROM AnswerRow
Run Code Online (Sandbox Code Playgroud)