【问题标题】:How do I get something similar to the SERIAL PG datatype in SQL Server 2008?如何获得类似于 SQL Server 2008 中的 SERIAL PG 数据类型的内容?
【发布时间】:2010-10-05 22:37:19
【问题描述】:

我正在帮助实现一个 SQL Server 2008 数据库,我有几列我想默认为序列中的下一个数字,但仍然可以随意手动插入数字。在 PostgreSQL 中,这是通过 SERIAL 数据类型和序列来完成的。不幸的是,这些东西在 SQL Server 中不存在。以下是我知道的行不通的方法。

  1. 除非您将 IDENTITY_INSERT 设置为 on,否则标识列不允许插入。在这种情况下,它可以按需要工作,但根据MSDN,此属性一次只能在一个表上设置,我想为多个表执行此操作。
  2. 可以将函数设置为字段的默认值,但由于函数无法在数据库中设置值,因此一旦设置了当前值,就无法更新计数。
  3. 存储过程可用于增加数字并将其返回,但不能将它们设置为列的默认值。

我现在采取的解决方法是简单地创建一个存储过程,该过程返回我想要的值并将其编码到 LINQ API 中,以便它自动发生。这会产生一些我想删除的样板代码。

我想在 SQL Server 中实现吗?

【问题讨论】:

    标签: c# linq-to-sql sql-server-2008 postgresql


    【解决方案1】:

    没有。身份列或自己滚动基本上是您的选择。

    【讨论】:

      【解决方案2】:

      有充分的理由不这样做 - 您必须实现 SQL 执行的所有锁定规则以确保获得唯一值 - 如果必须取回该值,则这样做可能会产生性能成本到您的数据或业务层(例如,您可以在保存之前在内存中构建对象图)。

      如果您真的想在内存中构建一个完整的对象图,然后一次性保存它,另一种方法是使用 GUID,但它们有自己的缺点。

      【讨论】:

      • 假设您每个表都有一个“序列”类型的东西,那么所需的锁定不会那么广泛,而 GUID 对于我希望在这里完成的工作来说太过分了。
      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      相关资源
      最近更新 更多