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

时间:2012-08-19 13:48:27

标签: reference foreign-keys db2 backup restore

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

过程

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

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

  2. drop table .comments

  3. 从ixf创建的/export/home/dale/comments.ixf导入.comments

    注意:此处的步骤3创建表但不插入任何数据行

  4. 从/export/home/dale/comments.ixf加载客户端,由identityoverride修改的ixf替换为.comments

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

  5. alter table .comments add FOREIGN KEY(comments_id)REFERENCES .news(article_key)

    注意:这里alter table失败,因为db2抱怨某些comments_id与article_key不匹配

  6. 有人可以帮助解决我的问题吗?提前致谢

2 个答案:

答案 0 :(得分:0)

错误意味着您在“注释”表中导入的某些行引用了“新闻”表中不存在的行。

您可能没有正确形成约束。列名“comment_id”听起来像是Comments表的主键。您需要与新闻表的主键匹配的外键。它也可能被称为“article_key”或“article_id”。

    ALTER TABLE Comments
      ADD FOREIGN KEY( article_key)
        REFERENCES News( article_key);

如果“comment_id”实际上不是“评论”表的主键,则问题来自于不同时备份和恢复“新闻”和“评论”表。

您可以导出和导入新闻表以及评论表,或删除引用缺少新闻行的评论

    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
      )

答案 1 :(得分:0)

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

  1. user980717解决了我将错误的列设置为外键的第一个问题
  2. 对于我的第二个问题,即“SQL0668N操作不允许原因代码”1“在表”tablename“.SQLSTATE = 57016”,我需要运行以下命令“设置niwps.comments立即检查的完整性”以确保数据满足表中定义的所有约束。感谢所有为解决我的问题而努力帮助我的人。干杯