如何在 SQL Server 中将索引从一个表复制到另一个表
Posted
技术标签:
【中文标题】如何在 SQL Server 中将索引从一个表复制到另一个表【英文标题】:How to copy indexes from one table to another in SQL Server 【发布时间】:2010-10-13 17:19:23 【问题描述】:我需要将索引从一个表复制到另一个。有很多索引,我不想从头开始重新创建它们。无论如何似乎容易出错。
我已经使用
复制了结构SELECT * INTO [BackupTable] FROM [OriginalTable]
但这不会复制索引、约束、触发器等
有人知道怎么做吗?
【问题讨论】:
【参考方案1】:我对 SQL Server 并不特别熟悉,但是根据在其他数据库中定义和使用数据库表的方式,我想说仅通过复制数据或使用 SELECT INTO 是无法做到这一点的。
索引需要定义为表结构的一部分,并且需要为表中可能存在的任何现有数据生成。
执行此操作的唯一方法是在 CREATE TABLE 语句期间或在创建表后使用 ALTER TABLE 语句。
处理数据本身的语句与处理表定义是分开的,所以我认为不会有任何解决方法或捷径。
我相信会有可用的工具来生成 ALTER TABLE 语句,以根据您已有的表创建所有适当的索引,使其变得简单可靠。
【讨论】:
【参考方案2】:您要复制索引定义吗?
然后您可以使用 Microsoft SQL 管理工具中的“脚本”选项对索引、触发器等进行反向工程
只需右键单击 SQL Management Studio 表列表中的表名,然后选择“Script Table as”,然后选择“Create to”
您不能复制索引数据,因为它与索引的物理存储有关
首先检查您是否将“工具/选项/SQL Server 对象资源管理器/脚本/脚本索引”设置为“True”。在某些版本的 SQL 管理工具(谢谢马克)
【讨论】:
【参考方案3】:您可以使用 sysindexes(或 sys.indexes,具体取决于您的版本)中的信息构建脚本来重新创建所有索引,但使用 Select * into 方法也不会获取外键和主键或任何扩展属性。如果您使用的是 2005+ 版本,您应该真正考虑使用 SSIS,或者如果您使用的是 2000,则应该考虑使用 DTS,两者都有向导来简化这种复制。
SSIS Import Export
DTS Import Export
【讨论】:
【参考方案4】:右键单击 SSMS 中的索引并执行脚本为 > create 。
更改表名和索引名就应该设置好了
【讨论】:
【参考方案5】:默认情况下,右键单击表“CREATE”不包含索引或触发器,仅包含表定义和约束。
您可以右键单击数据库,然后单击“任务”->“生成脚本”,这将允许您执行此操作
编辑:这是默认设置,但正如 TFD 所说,它可以更改,谢天谢地。
【讨论】:
-1 仅当您将“工具/选项/SQL Server 对象资源管理器/脚本/脚本索引”设置为“False”时。这是新版本中的默认设置吗? 那怎么样。显然是 2005 和 2008 R2 中的默认设置(我当然没有更改),我很高兴能够更轻松地做到这一点。【参考方案6】:你应该明白这里的想法
Sub CopyTemp(tblName As String, Optional WithIndex As Boolean = False)
Dim db As DAO.Database
Dim tDefOrig As DAO.TableDef
Dim tDefNew As DAO.TableDef
Dim idxOrig As DAO.Index
Dim idxNew As DAO.Index
Dim fld As DAO.Field
Dim tempName As String
tempName = "temp" & tblName
Set db = CurrentDb
db.Execute "Select * Into " & tempName & " From " & tblName
If WithIndex = True Then
Set tDefOrig = db.TableDefs(tblName)
Set tDefNew = db.TableDefs(tempName)
For Each idxOrig In tDefOrig.Indexes
Set idxNew = tDefNew.CreateIndex(idxOrig.Name)
With idxNew
For Each fld In idxOrig.Fields
.Fields.Append .CreateField(fld.Name)
Next
.Primary = idxOrig.Primary
.Unique = idxOrig.Unique
End With
tDefNew.Indexes.Append idxNew
tDefNew.Indexes.Refresh
Next
End If
End Sub
【讨论】:
欢迎来到 SO!感谢您花时间回答其他用户的问题;但是,请阅读how to answer 并确保您正在回答所提出的问题。不幸的是,这个答案不是很有帮助,因为 OP 专门询问了一个 SQL 服务器问题并且没有说明任何关于使用任何编程语言或库的内容,所以这个答案可能对作者没有任何意义或适用于他们的情况。跨度>以上是关于如何在 SQL Server 中将索引从一个表复制到另一个表的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 中将两个表合并到一个索引视图中
如何从 SQL Server 2014 中的 Select 查询中将数据分配给用户定义的表类型
使用SqlBulkCopy 从sybase复制表到sqlserver中遇到重复的数据怎么办? 能不能设置什,跳过该次插入