AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 289583
Accepted
Dirk Boer
Dirk Boer
Asked: 2021-04-10 19:57:27 +0800 CST2021-04-10 19:57:27 +0800 CST 2021-04-10 19:57:27 +0800 CST

为什么不能向 SQL Server 中的现有列添加标识?

  • 772

身份列有什么特别之处?

我很确定有一个正当的理由,但我试图更好地理解 SQL。

那么,一个身份列有什么特别之处,以至于回想起来不能轻易添加呢?

为什么每次插入新行时,这不仅仅是一个单一的 int/bigint 标志?

每行是否有任何物理存储的东西,这是一个困难的过程?

sql-server alter-table
  • 5 5 个回答
  • 466 Views

5 个回答

  • Voted
  1. Ronaldo
    2021-04-11T03:32:14+08:002021-04-11T03:32:14+08:00

    那么,一个身份列有什么特别之处,以至于回想起来不能轻易添加呢?

    标识本身不会在表上插入值,它取决于INSERT命令,并且表上的旧行需要UPDATE. 如果您尝试UPDATE使用标识列,则会收到如下错误:

    消息 8102,级别 16,状态 1,第 8 行
    无法更新标识列 'ColumnName'。

    每个功能都有目的和限制。标识的目的不是为了更新值。


    为什么每次插入新行时,这不仅仅是一个单一的 int/bigint 标志?

    实际上就是这样。CREATE TABLE ( Transact-SQL) IDENTITY (Property)说:

    SQL Server 可能出于性能原因缓存标识值,并且某些分配的值可能会在数据库故障或服务器重新启动期间丢失。

    因此,您的IDENTITY列有一个标志,它在插入新行时向 SQL Server 询问其中一个值。

    从文档的备注部分,IDENTITY您可以看到该功能有一些限制,原因是:

    这些限制是设计的一部分,目的是提高性能,并且因为它们在许多常见情况下都是可以接受的。

    • 4
  2. Best Answer
    Charlieface
    2021-04-12T06:25:19+08:002021-04-12T06:25:19+08:00

    如果我正确理解了您的问题,那么您不是在问如何创建具有新IDENTITY值的新列。您在问为什么我们不能ALTER TABLE tbl ALTER COLUMN col int IDENTITY在现有列上发布。

    正如你所说,它实际上是一个DEFAULT带有计数器的约束。

    我认为答案很简单,它从未实施过,显然没有足够的人要求它。所以我们必须使用变通方法。

    我认为添加这个特性没有什么大的困难,除了它必须被指定、实现和测试。因此,如果您需要此功能,请投票支持 Azure 上的现有反馈问题。

    • 4
  3. J.D.
    2021-04-11T04:48:18+08:002021-04-11T04:48:18+08:00

    记住罗纳尔多回答的第一段和最后一段,另一件需要注意的事情是,IDENTITY事后没有适当的机制可以在表格中添加一个。该IDENTITY列周围有几个参数,例如种子和增量值,它们甚至都可以是负数。IDENTITY列不需要是主键的一部分,也不依赖于它。

    如果能够在IDENTITY事后向表中添加一列,那么将无法关联这些IDENTITY值应该属于哪些行。需要在 SQL Server 中编写额外的机制,以提供一种方法来指定如何IDENTITY为每一行生成适当的值,可能使用ORDER BY子句。

    但即使这样也不能解决所有问题,因为如果用户指定一组非唯一的字段ORDER BY(但希望IDENTITY是唯一的),那么应该怎么做?...它可以像窗口函数IDENTITY一样随机选择一个ROW_NUMBER()确实如此,但它会使IDENTITY函数变得不确定,这对于列来说不是一个很好的特征IDENTITY。或者它可能只是生成重复IDENTITY值而不保证唯一性,这很好,但不能解决用户的问题。

    长话短说,如果 Microsoft 想要提供一种IDENTITY在表格填充行后向表格添加列的方法,这是可能的,但需要对应该如何完成进行一些思考。它也是一个不经常需要的功能,因此限制这样做的能力的当前设计是普遍可以接受的。

    • 1
  4. MBuschi
    2021-04-11T07:13:22+08:002021-04-11T07:13:22+08:00

    您不能向现有列添加标识,但可以开始使用序列。

    https://learn.microsoft.com/it-it/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15

    也许这可以给你一个选择。

    • 1
  5. user232822
    2021-06-18T00:46:45+08:002021-06-18T00:46:45+08:00

    您可以创建一个带有IDENTITY列的新空表,并使用ALTER TABLE SWITCH将行切换到新表定义作为仅限元数据的操作,因此这可以用于以繁琐的方式有效地切换身份属性。

    该IDENTITY属性只是某些系统表中的元数据属性,如果实施,这很容易更新。同时,ALTER TABLE ... SWITCH不要求该属性在源和目标中相同的事实可以用来有效地实现这一点。

    您仍然需要删除和重命名,但这会有所帮助,因为它只是更改了表元数据。行没有移动,最终您会得到与现在包含一IDENTITY列的表相关联的完全相同的数据和索引页。

    有关示例,请参阅为什么要删除不受支持的列上的 Identity 属性。

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve