【问题标题】:How to copy indexes from one table to another in SQL Server如何在 SQL Server 中将索引从一个表复制到另一个表
【发布时间】:2010-10-13 17:19:23
【问题描述】:

我需要将索引从一个表复制到另一个。有很多索引,我不想从头开始重新创建它们。无论如何似乎容易出错。

我已经使用

复制了结构
SELECT * INTO [BackupTable] FROM [OriginalTable]

但这不会复制索引、约束、触发器等

有人知道怎么做吗?

【问题讨论】:

    标签: sql sql-server database indexing


    【解决方案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 服务器问题并且没有说明任何关于使用任何编程语言或库的内容,所以这个答案可能对作者没有任何意义或适用于他们的情况。跨度>
            猜你喜欢
            • 2011-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多