【问题标题】:Change clustered index without touching primary key更改聚集索引而不触及主键
【发布时间】:2018-03-08 15:56:39
【问题描述】:

我们有一个现有的数据库,我们希望将聚集索引更改为唯一的、单调递增的字段(从一开始就应该如此),但我们不想更改主键,因为有数据引用此主键。

我们添加了一个新列 SequentialId 并用数据填充它,作为我们新的聚集索引。

但是我们如何改变聚集索引呢?如果可能,我们希望替换现有的聚集索引或将SequentialId 添加到当前索引作为第一列。

我们该怎么做呢?看来我们不能在不删除主键的情况下更改聚集索引(我们不能这样做)。

【问题讨论】:

  • 请记住,您的聚集索引键被该表上的所有非聚集索引用来引用一行,因此您应该尽一切努力使其尽可能窄。我使用的一般经验法则是尽可能使用 INT,否则使用 GUID。
  • 为什么一定要使用sequentialid呢?这似乎是一个奇怪的要求。我可以看看您是否使用了 guid,这有什么意义,但顺序值似乎有点奇怪。
  • @MJH 使用 guid 作为聚集索引不是一个好主意。它将仅用几百行就达到 99.9999% 的碎片,除非您使用 sequenceid 填充它,而这会违背目的。
  • @Sean Lange 您可以使用顺序 ID
  • @MJH 确定您可以使用顺序避免碎片,但有什么意义呢?对于聚集索引,您有一个非常宽的列,它只不过是一个占用更多空间的标识。

标签: sql sql-server


【解决方案1】:

使用ALTER TABLE 命令删除PRIMARY KEY 约束,这与删除强制PRIMARY KEY 约束的CLUSTERED INDEX 不同,并使用附加列重新创建

ALTER TABLE <Table_Name>
DROP CONSTRAINT <constraint_name>

ALTER TABLE <Table_Name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY (<Column1>,<Column2>)

【讨论】:

  • 问题很清楚地说'我们不能更改主键,因为有数据引用了这个主键'。因此,您的建议是错误的。
  • 嗯???怎么能说丢主键不等于丢主键呢?那没有意义。并且由于其他表引用了该键,因此必须先禁用所有外键,然后才能使用。
  • 我理解这个问题,因为提到的聚集索引正在执行提到的主键约束
猜你喜欢
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2019-12-22
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多