支持Microsoft SQL中的RESTful UPSERTS

时间:2017-02-28 22:09:32

标签: sql-server rest jdbc upsert identity-insert

我正在开发一个小型Web应用程序,并使用Microsoft SQL进行数据存储。我使用利用JDBC的服务层与数据库连接。

目前,当我尝试对ID不存在的“客户”进行PUT时,我不断收到错误:

Cannot insert explicit value for identity column in table 'Customers' when IDENTITY_INSERT is set to OFF.

为了支持正确的RESTful API,我希望能够插入此ID(如果它不存在)或更新已有的客户。我查了很多与我有关的问题,其中很多都小心翼翼地建议开启IDENTITY_INSERT,但是说这是一个不好的做法。我很好奇我可以做什么数据库或in-code来健康地支持RESTful PUT - 如果有一种方法可以在维护IDENTITY列的同时执行它,那么我可以在不了解CustomerID列的情况下进行POST操作。

1 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server 2012或更高版本,则可以使用序列。这将避免身份插入的需要。 https://msdn.microsoft.com/en-us/library/ff878058.aspx

无论您使用哪种技术,都需要对键范围进行分区,这样您就不会提供与生成的键重叠的键,因为SQL Server不知道您手动提供了哪些键。

要使用标识列执行此操作,您可以将列定义为标识(1000000,1),以便可以使用较低百万个键进行手动插入。如果使用标识列,则必须使用identity_insert手动提供值,因此最好使用序列。