我在 IBMi/System-i/iSeries/AS400 上有一个表,它没有外键、主键或任何类型的约束。 我正在尝试使用 SQL 添加主键:
ALTER TABLE MYLIB.TBLGB ADD CONSTRAINT MYLIB.R_MYLIB_PK_GB PRIMARY KEY (GBAPP, GBTSK, GBSET, GBSTP)
这导致:
Error: [SQL0538] The FOREIGN key in constraint R_MYLIB_PK_GB in MYLIB not same as the parent key. Cause . . . . . : The FOREIGN key in constraint R_MYLIB_PK_GB in MYLIB is not the same as the parent key of table *N in *N. The FOREIGN key must have the same number of columns as the parent key and the data type and attributes of the FOREIGN key must be identical to the data type and attributes of the corresponding column of the parent key. Recovery . . . : Correct the statement so that the description of the FOREIGN key conforms to that of the parent key of the specified table.
我对此感到非常困惑,因为绝对没有链接到此表的外键。 事实上,我已经从这个库的所有表中删除了所有约束。 我可以查看哪些内容来确定阻止这种情况的原因?
另一个有趣的细节是,这在其他本质上相同的库上运行良好......
使用 DSPFD 和 DSPDBR 命令检查文件描述和数据库关系。
约束由架构限定。因此,除非你也有一个名为 mylib 的架构,否则请删除限定条件。
它抱怨表的原因可能是因为它试图在模式中找到一个表,systables,但这纯粹是猜想。
最有可能的是,保存和还原的顺序不正确。该表具有不应保存的属性,这些属性应在保存之前删除。还原导致新系统上的数据库目录包含不一致的元素。
如果不是,那么下一个可能性(以及几乎唯一的其他可能性)是数据库目录在还原完成之前已经存在不一致。这些可能是由于不当的关闭或其他行动造成的。
第一步应该是:
RCLDBXREF OPTION(*CHECK)
如果报告了问题,请运行:
RCLDBXREF OPTION(*FIX)
如果系统对于 RCLDBXREF 命令来说太旧,请使用:
RCLSTG SELECT(*DBXREF)
旧版本没有可用的"*CHECK"选项。
根据数据库的大小和复杂性、所需的重新同步次数以及服务器的一般性能特征,这两种方法都可以运行 10 分钟到几小时。大多数无法解释的数据库编目问题(需要 PTF 的问题除外)都可以通过其中任何一个来清除。
RCLDBXREF 命令通常是首选,但有些问题需要 RCLSTG 替代方案。RCLSTG 存在重大限制,因此请务必阅读命令 [帮助]。