专栏首页.NET技术与企业级解决方案SQL Server数据库中导入导出数据及结构时主外键关系的处理

SQL Server数据库中导入导出数据及结构时主外键关系的处理

2015-01-26

  软件开发中,经常涉及到不同数据库(包括不同产品的不同版本)之间的数据结构与数据的导入导出。处理过程中会遇到很多问题,尤为突出重要的一个问题就是主从表之间,从表有外检约束,从而导致部分数据无法导入。

情景一、同一数据库产品,相同版本

  此种情况下源数据库与目标数据库的数据结构与数据的导入导出非常简单。

方法1:备份源数据库,恢复到目标数据库即完成。

方法2:使用SQL Sever数据库自带的【复制数据库】功能或者【导入数据】功能按照向导操作即可。

情景二、同一数据库产品,不同版本

     情景1、源数据库版本低,目标数据库版本高

此种情况处理方式同情景一。

     情景2、源数据库版本高,目标数据库版本低

由于目标数据库版本低于源数据库,源数据库中产生的脚本架构无法兼容低版本,所以不能通过直接备份还原的方式来操作。

  本文以SQL Server2008R2数据库为数据源、SQL2008 Express为目标数据库为例主要解决主从表之间,从表有外检约束时,数据导入失败的问题。操作过程分为以下几个步骤:

步骤1:从源数据库生成数据结构脚本【不包表含外键关系】

  在数据源188连接上,右键点击源数据库》【任务】》【生成脚本】

弹出“生成和发布脚本”

点击【下一步】按钮,弹出“简介”窗口

点击【下一步】按钮,弹出“设置脚本编写选项”

点击【高级】按钮,弹出具体设置窗口【此步骤非常重要

将“编写外键脚本”的值设置为false,意思是这一步骤生成的数据结构脚本中不包含表之间的外键关系。其他选项根据实际情况设置。

点击【确定】按钮,生成脚本,入下图。

将脚本另存为“OriginalDataStructureWithoutFK.sql”。

步骤2:导入数据结构脚本至目标数据库

  在目标服务器上新建目标数据库,命名同源数据库名(其他命名也可以)。

选中新建的数据库,打开步骤一中保存的”OriginalDataStructureWithoutFK.sql“脚本文件,运行该文件,运行成功后,目标数据库中成功创建了表、视图、存储过程、自定义函数,如下图

步骤3:从源数据库创建数据脚本

  此步骤中,借助第三方数据库插件SqlAssistant,其拥有强大的数据库扩展功能,本文不做详细介绍。可以到SqlAssistant官网了解更多http://www.softtreetech.com/isql.htm

选中源数据库,点击右键,【Sql Assistant】》【Scripts Data】

弹出”Table Data Export” 导出Table数据窗口

默认选中源数据库与所有的表。点击【Export】按钮,生成数据脚本至【新建查询窗口】中

保存该数据脚本为“OriginalData.sql”。

步骤4:导入数据脚本至目标数据库

对于表中主键或者其他设置为int类型,且设置自增长类型的列,需要做以下处理:

SET IDENTITY_INSERT dbo.T_ACL_User ON ;

一般字段如果是identity的,比如定义的时候nameid identity(1,1)就是说从1开始增长,每次加1,那么插入一条记录nameid字段是不需要手动赋值(一般也不允许)。那么有时候需要插入自定义值的时候,就设置set identity_insert on;就可以手动插入了。操作完数据插入后,再将其关闭。

选中目标数据库,并打开步骤3中保存的“OriginalData.sql”数据脚本,运行之,成功后,查看数据表

查询结果可以看出已经成功导入数据。

设置 SET IDENTITY_INSERT dbo.T_ACL_User Off ;

步骤5:从源数据库生成仅包含表外键关系的数据结构脚本

  步骤与步骤1大致相同,最后一步设置相反

红色框内,将“编写外键脚本”设置为True,其他选项与步骤1中设置相反。点击"确定"按钮,生成脚本,另存为“OriginalDataStructureOnlyWithFK.sql”。

步骤6:导入外键结构关系脚本至目标数据库

  选中目标数据库,打开步骤5中保存的“OriginalDataStructureOnlyWithFK.sql”脚本文件,运行之,运行成功后,查看表结构

外键已经成功创建。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring JPA起航 顶

    其中SimpleJpaRepository是他们所有接口的实现类,而JpaRepository以上其实都是兼容noSql的接口,而只有JpaRepository...

    算法之名
  • 缓存内功心法:缓存基础整理

    缓存雪崩是由于原有缓存失效(过期),新缓存未到期间。所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,...

    李红
  • Spring是如何保证同一事务获取同一个Connection的?使用Spring的事务同步机制解决:数据库刚插入的记录却查询不到的问题【享学Spring】

    关于Spring的事务,它是Spring Framework中极其重要的一块。前面用了大量的篇幅从应用层面、原理层面进行了比较全方位的一个讲解。但是因为它过于重...

    BAT的乌托邦
  • 搭建Linux环境的详细步骤(四)

    搭建一个”Discuz ! X ”网站, 该网站是康盛公司推出的一个社区平台,包含社区论坛,社交网络,社交游戏等等

    测试小兵
  • lua脚本操作redis数据库

    为什么要用lua脚本操作redis数据库? 1.减少开销–减少向redis服务器的请求次数 2.原子操作–redis将lua脚本作为一个原子执行 3.可复...

    编程珠玑
  • windows一机多装mysql,5.5低版本+5.8高版本

    进入后,找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL

    chenchenchen
  • Linux搭建环境的详细步骤(二)

    Mysql 是一个开源的小型关联式数据库管理系统, 特点是速度快,体积小,成本低,尤其还是开源的,所以目前被广泛应用于互联网中的中小型网站中

    测试小兵
  • Mariadb修改root密码

    默认情况下,新安装的 mariadb 的密码为空,在shell终端直接输入 mysql 就能登陆数据库。

    botkenni
  • 给中级Python开发者的13个练手项目,适合你不?

    该项目设计的主要目标是聚合内容。首先,我们需要知道内容聚合器从哪些站点获取内容。然后,使用请求库来发送 HTTP 请求,并使用 BeautifulSoup 解析...

    CDA数据分析师
  • 【小家java】Java中Future模式衍生出来的高级应用---自己手写一个数据库连接池

    阅读本文之前,请确保你已经了解了Java中Future模式。若没有,ring出门左转,参考博文:【小家java】一个例子让就能你彻底理解Java的Future模...

    BAT的乌托邦

扫码关注云+社区

领取腾讯云代金券