我有一个包含2个表的数据库:CurrentTickets& ClosedTickets。当用户通过Web应用程序创建票证时,将创建一个新行。当用户关闭票证时,来自currenttickets的行将插入ClosedTickets,然后从CurrentTickets中删除。如果用户重新打开票证,则会发生相同的情况,仅反过来。
问题是被复制回CurrentTickets的其中一列是标识符设置为ON的PK列(TicketID)。
我知道我可以将IDENTITY_INSERT设置为ON,但据我所知,这通常是不受欢迎的。我假设我的数据库设计有点差。有没有办法让我在不使用IDENTITY_INSERT的情况下完成我的需要?如何在不将其作为标识列的情况下自动增加TicketID列?我想我可以添加另一个列RowID并使其成为PK但我仍然希望TicketID列尽可能自动增量但仍然不被视为Idendity列。
答案 0 :(得分:2)
这看起来像2个表的糟糕设计。为什么不只有一个存储所有票证的票证表。然后添加一个名为IsClosed
的列,默认情况下为false。关闭故障单后,只需将值更新为true,就不必对其他表进行任何复制。
使用单个表格可以更简单,更容易地维护应用程序这一部分的所有代码。
答案 1 :(得分:0)
要在最新版本的SQL Server中实现此目的,请使用OUTPUT
子句(definition on MSDN)。
OUTPUT子句与表变量一起使用:
declare @MyTableVar (...)
DELETE FROM dbo.CurrentTickets
OUTPUT DELETED.* INTO @MyTableVar
WHERE <...>;
INSERT INTO ClosedTicket
Select * from @MyTableVar
第二个表应该有ID
列,但没有IDENTITY
属性。它由另一个表强制执行。
答案 2 :(得分:0)
简单回答是,如果您希望影响该列中生成的下一个Id,请不要创建标识列。
此外,我认为你的架构非常糟糕,而不是让两个表只在CurrentTickets
表中添加另一列,例如Open BIT
,并默认将其值设置为1
并在客户端关闭故障单时将值更改为0
。
你可以在客户改变主意的同时打开/关闭它,不得不经历插入标识的所有麻烦并管理整个单独的表。
由于您现在提到了SQL Server 2014,因此您可以访问名为Sequence Object
的内容。
您可以定义一次对象,然后每次想要一个序列号,只需从中选择下一个值,它就是一个标识列的混合体,并且具有一个简单的INT列。