我需要将索引从一个表复制到另一个表。有很多索引,我不想从头开始重新创建它们。无论如何似乎都容易出错。
我使用
复制了结构SELECT * INTO [BackupTable] FROM [OriginalTable]
但是这不会复制索引,约束,触发器等
有谁知道怎么做?
答案 0 :(得分:44)
您要复制索引定义吗?
然后,您可以使用Microsoft SQL管理工具中的“脚本”选项对索引,触发器等进行反向工程设计
只需右键单击SQL Management Studio表列表中的表名,然后选择“Script Table as”,然后选择“Create to”
您无法复制索引数据,因为它与索引的物理存储相关
首先检查您是否将“工具/选项/ SQL Server对象资源管理器/脚本/脚本索引”设置为“True”。在某些版本的SQL管理工具中将此设置为false(谢谢Mark)
答案 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,两者都有向导来简化这种副本。
答案 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