2012-10-19 42 views
2

其实我有两个数据库,一个用于分级,一个用于生产。 一个表,例如称为Class(class_id,descr,faculty_id)faculty_id参考到另一个表称为Faculty(faculty_id, name,comment)如何使用外键更新表格

我的故事是,我做的临时数据库,表系上这么多的更新,改变很多教师意见和名称,而无需改变Class表。我想将升级的Faculty表复制到Production。我最初的方法是从分段生成脚本并删除生产中的数据表Faculty,然后运行脚本以便将分段数据表Faculty复制到生产中。但是,我发现我不能删除Faculty表,因为外键。但我不想写下数百条更新声明,也不能删除生产中的类数据,如果我想将Faculty表复制到生产中,我该怎么办?

+0

请问什么版本的SQL Server。 – RBarryYoung

回答

0

试试这个:

备份你的持有外键的类表。

截断类表。

向教师作出更新。

最后还原你的班级表。

+0

这是一个问题或答案?如果它的一个问题,然后PLZ写它作为评论! –

+0

您不能截断有外键的表。在这种情况下,类表中的faculty_id .. – dotNETbeginner

1

暂时删除classfaculty之间的关系,并尽一切,然后重新建立新的关系..

0

让我们假设所有分期学院代理键是相同的生产。

  1. 复制系表生产为Faculty_Staging
  2. 变更属于表删除外键参考系
  3. 重命名教员Faculty_backup
  4. 重命名Faculty_Staging:教师
  5. 变更属于表和恢复外键约束

如果重建外键引用的尝试失败,则有您在升级的Faculty表中存在代理键问题。

  1. 重命名教员Faculty_Staging
  2. 重命名Faculty_Backup:教师
  3. 变更属于表和恢复外键约束。

需要考虑的事情:

  1. 不要在学院的代理键,准确Faculty_Staging匹配?
  2. 在Faculty和Faculty_Staging匹配完全匹配吗?
  3. 你有没有无意中删除了教师 分期任何生产行?
0

你知道你可以生成SQL脚本使用SQL? (这只工作,如果教师在临时和生产相同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 一旦您开始使用这些,您的问题可能会有所不同。

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