SQL Server中如何复制包含约束与键信息的表?当前仅能复制架构
嘿,我来帮你搞定这个问题!在SQL Server里只复制表架构肯定不够,要带上主键、外键、约束这些完整信息,有几种实用的方法,我给你一步步讲清楚:
方法1:用SSMS图形化生成脚本(最直观,新手友好)
这是最省心的方式,SQL Server Management Studio会帮你自动生成包含所有对象的完整脚本:
- 打开SSMS,找到目标表所在的数据库,展开表列表
- 右键点击要复制的表 → 「任务」→ 「生成脚本」
- 在弹出的向导里,点击「下一步」,选中你要复制的表(可以多选)
- 到「设置脚本编写选项」页面,点击「高级」按钮
- 在高级选项弹窗里,找到「编写数据的脚本」,选择「Schema and Data」;同时确保「编写主键的脚本」「编写外键的脚本」「编写约束的脚本」「编写默认值的脚本」这些选项都设为「True」
- 调整完其他选项(比如脚本保存到查询窗口还是文件),点击「确定」完成向导
- 运行生成的脚本,就能得到和原表完全一致的新表(包含所有约束、键和数据)
方法2:T-SQL手动实现(适合自动化或命令行场景)
如果需要用代码自动化操作,可以分两步:先复制架构和数据,再手动迁移约束和键:
第一步:复制表架构和数据
用SELECT INTO快速生成基础表:
SELECT * INTO NewTableName FROM OriginalTableName;
*注意:SELECT INTO虽然能快速复制架构和数据,但不会复制主键、外键、默认约束、检查约束这些对象,所以需要第二步操作。
第二步:迁移主键、外键等约束
可以通过查询SQL Server的系统视图,自动生成创建约束的脚本,比如:
生成主键脚本
SELECT 'ALTER TABLE NewTableName ADD CONSTRAINT PK_NewTableName PRIMARY KEY (' + STRING_AGG(COL_NAME(ic.object_id, ic.column_id), ', ') + ');' AS CreatePrimaryKeyScript FROM sys.indexes i JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id WHERE i.object_id = OBJECT_ID('OriginalTableName') AND i.is_primary_key = 1;
执行查询后,把结果里的脚本复制出来运行,就能给新表加上主键。
生成外键脚本
SELECT 'ALTER TABLE NewTableName ADD CONSTRAINT FK_NewTableName_' + fk.name + ' FOREIGN KEY (' + STRING_AGG(COL_NAME(fkc.parent_object_id, fkc.parent_column_id), ', ') + ') REFERENCES ' + OBJECT_NAME(fkc.referenced_object_id) + '(' + STRING_AGG(COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id), ', ') + ');' AS CreateForeignKeyScript FROM sys.foreign_keys fk JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id WHERE fk.parent_object_id = OBJECT_ID('OriginalTableName');
同样,执行查询得到脚本后运行,就能迁移外键。
生成检查约束和默认约束
类似地,用sys.check_constraints和sys.default_constraints视图可以生成对应的脚本,比如检查约束:
SELECT 'ALTER TABLE NewTableName ADD CONSTRAINT ' + cc.name + ' CHECK (' + cc.definition + ');' FROM sys.check_constraints cc WHERE cc.parent_object_id = OBJECT_ID('OriginalTableName');
方法3:bcp工具(适合超大表的离线复制)
如果要复制的表数据量极大,用bcp工具(SQL Server自带的命令行工具)效率更高,步骤是:
- 先通过SSMS生成新表的架构+约束脚本,创建空的新表
- 用bcp导出原表数据:
bcp "SELECT * FROM OriginalTableName" queryout "C:\Temp\TableData.dat" -S YourServerName -d YourDatabaseName -T -n
- 再用bcp把数据导入新表:
bcp NewTableName in "C:\Temp\TableData.dat" -S YourServerName -d YourDatabaseName -T -n
*参数说明:-T表示用Windows身份验证,-n表示用原生数据格式,速度更快。
内容的提问来源于stack exchange,提问作者Ravi Solanki
相关产品推荐
相关产品推荐

