插入&从SQL最佳实践中删除

时间:2014-08-25 23:54:41

标签: sql sql-server tsql

我有一个包含2个表的数据库:CurrentTickets& ClosedTickets。当用户通过Web应用程序创建票证时,将创建一个新行。当用户关闭票证时,来自currenttickets的行将插入ClosedTickets,然后从CurrentTickets中删除。如果用户重新打开票证,则会发生相同的情况,仅反过来。

问题是被复制回CurrentTickets的其中一列是标识符设置为ON的PK列(TicketID)。

我知道我可以将IDENTITY_INSERT设置为ON,但据我所知,这通常是不受欢迎的。我假设我的数据库设计有点差。有没有办法让我在不使用IDENTITY_INSERT的情况下完成我的需要?如何在不将其作为标识列的情况下自动增加TicketID列?我想我可以添加另一个列RowID并使其成为PK但我仍然希望TicketID列尽可能自动增量但仍然不被视为Idendity列。

3 个答案:

答案 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列。