实际上我有两个数据库,一个用于暂存一个正在生产中。
一个表,例如名为Class(class_id,descr,faculty_id)
,faculty_id
引用另一个名为Faculty(faculty_id, name,comment)
的表。
我的故事是我在登台数据库,教师表上做了很多更新,更改了许多教师评论和姓名而不更改班级表。我想将暂存Faculty表复制到Production。我最初的方法是从登台生成脚本并删除数据表,生产中的Faculty并运行脚本以便将登台数据表Faculty复制到生产环境。但是我发现因为外键我无法删除Faculty表。但是我不想写下数百个更新语句,也不能删除生产中的类数据,如果我想将Faculty表复制到生产中怎么办呢?
答案 0 :(得分:1)
暂时删除class
和faculty
之间的关系并执行任何操作,然后再次建立关系..
答案 1 :(得分:0)
试试这个:
备份持有外键的类表。
截断类表。
向教师进行更新。
最后恢复你的班级表。
答案 2 :(得分:0)
让我们假设暂存Faculty中的所有代理键与生产中的相同。
如果重建外键引用的尝试失败,则您的staging 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 一旦你开始使用这些,你的问题可能会有所不同。
这可能是古怪的想法,但我发现之前很方便......