0

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

过程

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

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

  2. 删除表 .comments

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

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

  4. 将客户端从 /export/home/dale/comments.ixf 的由 identityoverride 修改的 ixf 加载到 .comments

    注意:直到这一步,我可以在重新创建的 db 表中插入 5423 行数据

  5. 更改表 .comments 添加 FOREIGN KEY (comments_id) REFERENCES .news (article_key)

    注意:此处更改表失败,因为 db2 抱怨某些 comments_id 与 article_key 不匹配

有人可以在这里帮助我解决我的问题吗?提前致谢

4

2 回答 2

0

该错误意味着您 IMPORT 到 Comments 表中的某些行引用了 News 表中不存在的行。

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

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

如果“comment_id”确实不是“Comments”表的主键,那么问题出在没有同时备份和恢复News和Comments表。

您可以将 News 表与 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
      )
于 2012-08-21T18:20:04.910 回答
0

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

  1. user980717 解决了我将错误的列设置为外键的第一个问题
  2. 对于我的第二个问题,即“SQL0668N Operation not allowed for reason code “1” on table “tablename”。SQLSTATE=57016”,我需要运行以下命令“set integrity for niwps.comments immediate checked”以确保所有数据都满足表中定义的约束。感谢所有努力帮助我解决问题的人。干杯
于 2012-08-28T06:35:16.780 回答