如何在SQL Server中将索引从一个表复制到另一个表

时间:2009-03-16 21:03:26

标签: sql sql-server database indexing

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

我使用

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

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

有谁知道怎么做?

6 个答案:

答案 0 :(得分:44)

您要复制索引定义吗?

然后,您可以使用Microsoft SQL管理工具中的“脚本”选项对索引,触发器等进行反向工程设计

只需右键单击SQL Management Studio表列表中的表名,然后选择“Script Table as”,然后选择“Create to”

您无法复制索引数据,因为它与索引的物理存储相关

首先检查您是否将“工具/选项/ SQL Server对象资源管理器/脚本/脚本索引”设置为“True”。在某些版本的SQL管理工具中将此设置为false(谢谢Mark)

enter image description here

答案 1 :(得分:9)

默认情况下,右键单击表“CREATE”不包括索引或触发器,只包括表定义和约束。

您可以右键单击数据库,然后单击“任务” - > “生成脚本”,这将允许您这样做

编辑:这是默认设置,但正如TFD所提到的那样,谢天谢地,它可以改变。

答案 2 :(得分:1)

我并不是特别熟悉SQL Server,但是基于在其他数据库中定义和使用数据库表的方式,我想说只需复制数据或使用SELECT INTO就无法做到这一点。 / p>

索引需要定义为表结构的一部分,需要为表中可能存在的任何现有数据生成。

执行此操作的唯一方法是在创建表之后使用ALTER TABLE语句在CREATE TABLE语句中。

使用数据本身的语句与使用表定义是分开的,因此我认为不会有任何解决方法或快捷方式。

我确信会有工具可用于生成ALTER TABLE语句,以根据您已有的表创建所有适当的索引,从而使其变得简单可靠。

答案 3 :(得分:1)

您可以使用sysindexes(或sys.indexes,具体取决于您的版本)中的信息来构建脚本来重新创建所有索引,但使用Select * into方法也不会获取外键和主键或任何扩展的特性。如果你使用的是2005+版本,你应该真正考虑使用SSIS,如果你使用2000版本,你应该使用DTS,两者都有向导来简化这种副本。

SSIS Import Export

DTS Import Export

答案 4 :(得分:1)

在SSMS中右键单击索引,然后执行脚本>创建 。

更改表名和索引名称,您应该设置

答案 5 :(得分:-1)

你应该明白这个想法

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