Reference 保留外键约束的DB2备份和恢复db表

Reference 保留外键约束的DB2备份和恢复db表,reference,foreign-keys,db2,backup,restore,Reference,Foreign Keys,Db2,Backup,Restore,我目前在db2开发机器上进行数据库表的测试备份和恢复时遇到了问题。他从未完全成功过。虽然我能够在删除并重新创建表后恢复所有数据,但我无法重置外键约束,因为我收到SQL错误,抱怨键不匹配。以下是我的具体步骤,我肯定不是完全正确的方法,但它最终会恢复5423行数据: 过程 导出到/export/home/dale/comments.ixf的ixf消息/export/home/dale/msg.txt选择*from.comments 注意:步骤1将5423行数据导出到一个位置 删除表格。注释 从ixf

我目前在db2开发机器上进行数据库表的测试备份和恢复时遇到了问题。他从未完全成功过。虽然我能够在删除并重新创建表后恢复所有数据,但我无法重置外键约束,因为我收到SQL错误,抱怨键不匹配。以下是我的具体步骤,我肯定不是完全正确的方法,但它最终会恢复5423行数据:

过程

导出到/export/home/dale/comments.ixf的ixf消息/export/home/dale/msg.txt选择*from.comments

注意:步骤1将5423行数据导出到一个位置

删除表格。注释

从ixf的/export/home/dale/comments.ixf导入到.comments中

注意:这里的步骤3创建表,但不插入任何数据行

将客户机从/export/home/dale/comments.ixf加载到由identityoverride修改的ixf的.ixf中替换为.comments

注意:在此步骤之前,我能够在重新创建的db表中插入5423行数据

alter table.comments添加外键comments\u id REFERENCES.news article\u KEY

注意:这里ALTERTABLE失败,因为db2抱怨某些注释\u id与文章\u键不匹配


有人能帮我解决这个问题吗?提前感谢

此错误意味着您导入到Comments表中的某些行引用了新闻表中不存在的行

您可能没有正确形成约束。列名comment_id听起来像Comments表的主键。您需要与新闻表的主键匹配的外键。它也可以称为article\u key或article\u id

    ALTER TABLE Comments
      ADD FOREIGN KEY( article_key)
        REFERENCES News( article_key);
如果comment_id确实不是Comments表的主键,那么问题在于没有同时备份和恢复News表和Comments表

您可以将新闻表与注释表一起导出和导入,也可以使用类似的方法删除引用缺少的新闻行的注释

    DELETE FROM Comments
      WHERE comments_id NOT IN (
        SELECT article_key
          FROM News
      )
在执行此操作之前,您可能希望尝试列出将被上述查询删除的注释

    SELECT * 
      FROM Comments
      WHERE comments_id NOT IN (
        SELECT article_key
          FROM News
      )

我找到了解决问题的方法,也找到了上面的评论

user980717解决了我的第一个问题,我将错误的列设置为外键 对于我的第二个问题,即表tablename上的原因代码1不允许SQL0668N操作。SQLSTATE=57016,我需要为niwps运行以下命令集integrity.comments immediate checked,以确保数据满足表中定义的所有约束。感谢所有帮助我解决问题的人。干杯
并没有真正回答您的问题,但为什么要使用导出进行备份和恢复?导出并不是真正的备份。嗨,Matthew,它实际上是一个表的备份,而不是整个数据库的备份。这只是我的方法,我不认为这是正确的方法。然而,我很有信心在db2中会有一种更合适的方法在表级别进行备份和恢复,但我不知道它是什么。干杯,请发布您从第5步收到的实际错误消息。感谢您回答我的问题。我刚刚发现,当我在步骤4之前执行步骤5时,它以某种方式工作,但在执行select*from comments时,我最终出现以下错误执行操作时出错:表NIWPS.NEWS\u comments\u COPY上的原因代码1不允许操作。。SQLCODE=-668,SQLSTATE=57016,DRIVER=3.57.82这是相同的原因。您正在comments.ixf中导入的内容指的是不存在的新闻行。你能回答这两个问题吗?1新闻表的主键可能是article_id。2评论中是否有名为article_id的列?我猜是的。如果是这样,您需要使用上面指定的ALTERTABLE语句。将外键注释id更改为外键文章id谢谢,我明白你的意思。但是,当我在外键中将comment_id更改为article_key时,我在执行另一个select*from comments时会遇到相同的错误。表NIWPS.COMMENTS.上的原因代码1不允许操作。。SQLCODE=-668,SQLSTATE=57016,DRIVER=3.57.82。为了回答上面的问题,主键是comment_id,而不是article_key。换句话说,comments表中有一个article_key字段,但它不是主键。db2有没有办法只备份和恢复一个表,以保持引用完整性?为什么这么难做到这一点?这是一个如此普遍的需求,为什么db2不能满足这个需求?对于其他数据库(如Oracle和SQL),这也是一个问题吗?