如何在 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中遇到重复的数据怎么办? 能不能设置什,跳过该次插入

在 Sql Server 2008 中索引视图是不是实际上复制了原始数据?

在 SQL 中将行从一个表复制到另一个表

如何在同一个表中将数据从一列复制到另一列?