2

实际上我有两个数据库,一个用于暂存,一个用于生产。一个表,例如称为Class(class_id,descr,faculty_id)faculty_id对另一个表的引用称为Faculty(faculty_id, name,comment).

我的故事是,我在暂存数据库、Faculty 表上做了很多更新,在不更改 Class 表的情况下更改了很多教师评论和名称。我想将临时教员表复制到生产。我原来的方法是从 staging 生成脚本并删除数据表,在生产中的 Faculty 并运行脚本,以便将 staging 数据表 Faculty 复制到生产。但是我发现我无法删除 Faculty 表,因为外键。但是我不想写几百条更新语句,也不能删除生产中的Class数据,如果我想将Faculty表复制到生产中怎么办?

4

4 回答 4

1

暂时删除classandfaculty和do之间的关系,然后再建立关系。。

于 2012-10-19T20:42:36.243 回答
0

让我们假设 staging Faculty 中的所有代理键与生产中的代理键相同。

  1. 将 Faculty 表复制到 Production 作为 Faculty_Staging
  2. 更改班级表并删除对教师的外键引用
  3. 将学院重命名为 Faculty_backup
  4. 将 Faculty_Staging 重命名为 Faculty
  5. 更改类表并恢复外键约束

如果尝试重建外键引用失败,则您的临时教员表中的代理键存在问题。

  1. 将学院重命名为 Faculty_Staging
  2. 将 Faculty_Backup 重命名为 Faculty
  3. 更改类表并恢复外键约束。

需要考虑的事项:

  1. Faculty 和 Faculty_Staging 中的代理键是否完全匹配?
  2. Faculty 和 Faculty_Staging 中的备用键是否完全匹配?
  3. 您是否无意中删除了 Faculty staging 中的任何生产行?
于 2012-10-19T23:12:05.673 回答
0

尝试这个:

备份包含外键的类表。

截断类表。

对教师进行更新。

最后恢复你的班级表。

于 2012-10-19T20:13:15.797 回答
0

您知道您可以使用 SQL 生成 SQL 脚本吗?(这仅适用于faculty 在staging 和production 中具有相同faculty_id 的情况)

这将生成插入新学院的脚本:

SELECT 'INSERT INTO production.Faculty (faculty_id, name, comment) 
        SELECT TOP 1 '+LTRIM(faculty_id)+','''+name+''','''+comment+'''
          FROM production.Faculty
         WHERE NOT EXISTS (SELECT 1 FROM production.Faculty WHERE faculty_id = '+LTRIM(faculty_id)+');' AS runMeOnProduction
  FROM staging.Faculty

这将生成脚本来更新现有学院:

SELECT 'UPDATE production.Faculty SET name = '''+name+''', comment = '''+comment+'''
         WHERE faculty_id = '+LTRIM(faculty_id)+';' AS runMeOnProduction
  FROM staging.Faculty

如果您的姓名或评论字段中有引号,您可能希望将上述 SQL 语句中的姓名和评论替换为:

REPLACE(name,'''','''''')
REPLACE(comment,'''','''''')

这不是最好的方法,特别是如果您在两种环境中的两个表上都获得插入和更新。但是,如果教职员工的数据仅在分期方面有所增长,那么这项工作就可以了。

此外,一些查询软件在您运行这些 SQL 语句时会显示一个 blob 或一些十六进制,因为它认为字符串太长无法显示,如果您复制粘贴它,它可能仍然正确。否则尝试另一个 SQL 查询工具。我将 DBVisualiser 用于这种事情并且它有效。我不是为任何特定的数据库查询工具做广告,只是我必须经常查询 mySQL 和 MSSQL,所以我发现自己从一个应用程序跳到另一个应用程序以完成工作。

如果在两种环境中都有数据输入,您应该考虑使用适当的数据比较工具:http ://en.wikipedia.org/wiki/Comparison_of_database_tools 一旦您开始使用这些,您的问题可能会有所不同。

这可能是古怪的想法,但我之前发现它很方便......

于 2012-10-20T05:19:30.063 回答