You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自带的命令行工具)效率更高,步骤是:

  1. 先通过SSMS生成新表的架构+约束脚本,创建空的新表
  2. 用bcp导出原表数据:
bcp "SELECT * FROM OriginalTableName" queryout "C:\Temp\TableData.dat" -S YourServerName -d YourDatabaseName -T -n
  1. 再用bcp把数据导入新表:
bcp NewTableName in "C:\Temp\TableData.dat" -S YourServerName -d YourDatabaseName -T -n

*参数说明:-T表示用Windows身份验证,-n表示用原生数据格式,速度更快。


内容的提问来源于stack exchange,提问作者Ravi Solanki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:40:25