如何用外键更新表

时间:2012-10-19 20:11:24

标签: sql sql-server tsql foreign-keys

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

我的故事是我在登台数据库,教师表上做了很多更新,更改了许多教师评论和姓名而不更改班级表。我想将暂存Faculty表复制到Production。我最初的方法是从登台生成脚本并删除数据表,生产中的Faculty并运行脚本以便将登台数据表Faculty复制到生产环境。但是我发现因为外键我无法删除Faculty表。但是我不想写下数百个更新语句,也不能删除生产中的类数据,如果我想将Faculty表复制到生产中怎么办呢?

4 个答案:

答案 0 :(得分:1)

暂时删除classfaculty之间的关系并执行任何操作,然后再次建立关系..

答案 1 :(得分:0)

试试这个:

备份持有外键的类表。

截断类表。

向教师进行更新。

最后恢复你的班级表。

答案 2 :(得分:0)

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

  1. 将Faculty表复制到Production as Faculty_Staging
  2. 更改类表并删除对Faculty的外键引用
  3. 将Faculty重命名为Faculty_backup
  4. 将Faculty_Staging重命名为Faculty
  5. 更改类表并恢复外键约束
  6. 如果重建外键引用的尝试失败,则您的staging Faculty表中的代理键存在问题。

    1. 将教师重新命名为Faculty_Staging
    2. 将Faculty_Backup重命名为Faculty
    3. 更改类表并恢复外键约束。
    4. 需要考虑的事项:

      1. Faculty和Faculty_Staging中的代理键是否完全匹配?
      2. Faculty和Faculty_Staging中的备用键是否完全匹配?
      3. 您是否无意中删除了Faculty中的所有生产行 分期?

答案 3 :(得分:0)

您知道可以使用SQL生成SQL脚本吗? (这仅适用于Faculty在分期和制作方面具有相同的faculty_id)

这将是插入新学院的gen脚本:

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

这将是用于更新现有学院的gen脚本:

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,所以我发现自己从App跳到应用程序以完成工作。

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

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