【问题标题】:how to update table with foreign key如何用外键更新表
【发布时间】:2015-04-02 21:21:44
【问题描述】:

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

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

【问题讨论】:

  • 请问什么版本的 SQL Server。

标签: sql sql-server tsql foreign-keys


【解决方案1】:

暂时删除classfaculty之间的关系,然后做任何事情,然后重新建立关系..

【讨论】:

    【解决方案2】:

    试试这个:

    备份包含外键的类表。

    截断类表。

    向学院更新。

    最后恢复你的班级表。

    【讨论】:

    • 这是一个问题还是一个答案?如果它是一个问题,那么请把它写成评论!!
    • 您不能截断具有外键的表。在这种情况下,类表中的faculty_id ..
    【解决方案3】:

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

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

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

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

    需要考虑的事项:

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

    【讨论】:

      【解决方案4】:

      您知道您可以使用 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 一旦你开始使用这些,你的问题可能会有所不同。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 2010-12-20
        • 1970-01-01
        相关资源
        最近更新 更多