繁体   English   中英

从SQL最佳实践插入和删除

[英]Insert & Delete from SQL best practice

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

问题在于,复制回CurrentTickets的列之一是id设置为ON的PK列(TicketID)。

我知道我可以将IDENTITY_INSERT设置为ON,但是据我所知,通常对此并不满意。 我假设我的数据库设计不佳。 有没有一种方法可以使我无需使用IDENTITY_INSERT即可完成所需的工作? 我如何在没有使其成为身份列的情况下使TicketID列自动递增? 我想我可以添加另一个列RowID并使其成为PK,但我仍然希望TicketID列在可能的情况下自动递增,但仍不被视为Idendity列。

这似乎是2张桌子的糟糕设计。 为什么不只拥有一个存储所有票证的票证表呢? 然后添加一列IsClosed ,默认情况下为false。 关闭票证后,您只需将值更新为true即可,而不必在其他表之间进行任何复制。

使用一张票证表,围绕应用程序这一部分的所有代码都将变得更加简单和易于维护。

要在最新版本的SQL Server中实现此目的,请使用OUTPUT子句( MSDN上的定义 )。

与表变量一起使用的OUTPUT子句

declare @MyTableVar (...)

DELETE FROM dbo.CurrentTickets
OUTPUT DELETED.* INTO @MyTableVar
WHERE <...>;

INSERT INTO ClosedTicket
Select * from @MyTableVar

第二个表应具有ID列,但没有IDENTITY属性。 它由另一个表强制执行。

简单的答案是,如果您希望影响该列中生成的下一个ID,请不要创建“身份”列。

我还认为您的架构非常差劲,而不是拥有两个表,而只是在CurrentTickets表中添加另一列,例如Open BIT并将其值默认设置为1 ,并在客户端关闭Ticket时将其值更改为0

而且,您可以在客户改变主意的情况下多次打开/关闭它,而不必经历插入标识和管理整个单独表的所有麻烦。

更新资料

从现在开始,您已经提到了它的SQL Server 2014,您可以访问名为Sequence Object东西。

定义对象一次,然后每次想要从中选择序列号时,只需从中选择下一个值,它就是Identity列和一个简单的INT列的混合体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM