1

SequenceIdは自動インクリメントのID列ですが、主キーではありません。

私がしたいのは、行が更新SequenceIdされると、次に使用可能な値に設定されることです。例:

_____________________
| SequenceId | Name |
| 1          | John |
| 2          | Jane |
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

JohnをJackに更新します。SequenceId次に使用可能なID値に設定されます。

_____________________
| SequenceId | Name |
| 3          | Jack |
| 2          | Jane |
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

これはSQLServerで可能ですか?そうでない場合、代替手段は何でしょうか?

4

3 に答える 3

6

少なくとも簡単に、またはきれいにできるとは思いません。ROWVERSION列を使用しないのはなぜですか? ROWVERSION 列は、行がデータベース内の新しい一意の増分値に更新されるたびに更新されます。インデックスを作成する場合は、bigint に変換する計算列を作成できます。欠点は、タイムスタンプがデータベース全体に適用されるため、それらを使用する複数のテーブルがある場合、スキップされた数値が取得される可能性があることです。

フィドル

create table TestRowVersion (
    Id int primary key,
    Name varchar(20),
    BinaryRowVersion ROWVERSION,
    IntegerRowVersion as convert(BIGINT, BinaryRowVersion)
)   

create index IDX_TestRowVersion on TestRowVersion (IntegerRowVersion)

insert into TestRowVersion (Id, Name) values (1, 'Alvin')
insert into TestRowVersion (Id, Name) values (2, 'Betsy')
insert into TestRowVersion (Id, Name) values (3, 'Charles')
select * From TestRowVersion
update TestRowVersion set Name = 'Frank' where Id = 2
select * From TestRowVersion

[編集] - Timestamp が廃止されたため、RowVersion を使用するように更新されました

于 2012-08-20T05:06:14.610 に答える
0

これはうまくいくはずです...

SET IDENTITY_INSERT [table] ON

UPDATE [table]
SET Name = 'some name',
    SequenceId = MAX(SequenceId) + 1
WHERE ID = 123

SET IDENTITY_INSERT [table] OFF
于 2012-08-20T03:44:00.860 に答える