在 Microsoft SQL 中支持 RESTful UPSERTS

Supporting RESTful UPSERTS in Microsoft SQL

我正在开发一个小型 Web 应用程序并使用 Microsoft SQL 进行数据存储。我正在使用利用 JDBC.

的服务层与数据库交互

目前,当我尝试将 ID 不存在的 "Customer" 放入数据库时​​,我不断收到错误消息:

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

为了支持正确的 RESTful API,我希望能够插入此 ID(如果它不存在)或更新现有客户。我查找了无数与我的问题有些相关的问题,其中很多都谨慎地建议打开 IDENTITY_INSERT,但说这是一种不好的做法。我很好奇我可以在数据库或代码中做些什么来健康地支持 RESTful PUT - 如果有办法在维护 IDENTITY 列的同时做到这一点,那么我可以在不知情的情况下进行 POST 操作CustomerID 列。

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

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

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