我在iSeries(IBM-I/AS400)上有一个表,它有一些限制。该表是用类似SQL的方式创建的,有一些外键从其他表链接到该表(实际的SQL在这里有点模糊):
CREATE TABLE ABCLIB.ABCDE (
DEIDN INTEGER NOT NULL WITH DEFAULT,
DETTL VARGRAPHIC (50) ALLOCATE(25),
DETYP CHAR (1) NOT NULL WITH DEFAULT);
ALTER TABLE ABCLIB.ABCDE ADD PRIMARY KEY (DEIDN);
ALTER TABLE ABCLIB.ABCFG ADD FOREIGN KEY (FGDEK)
REFERENCES ABCLIB.ABCDE (DEIDN)
ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE ABCLIB.ABCHI ADD FOREIGN KEY (HIDEK)
REFERENCES ABCLIB.ABCDE (DEIDN)
ON DELETE RESTRICT ON UPDATE RESTRICT;
现在,很久以后,我将需要更改该表以添加字段:
ALTER TABLE ABCLIB.ABCDE ADD COLUMN DEICN VARGRAPHIC (100) ALLOCATE(50)
导致此消息:
Row or object ABCDE in ABCLIB type *FILE in use.
我已经检查过了,现在这个表上肯定没有对象锁。当我查看作业日志时,我看到:
Constraint cannot be removed from file Q_AT000000.
Constraint(s) not removed from file Q_AT000000.
File ABCDE in ABCLIB not changed.
Row or object ABCDE in ABCLIB type *FILE in use.
现在,我当然可以删除并重新添加所讨论的约束,但我觉得这不应该是必要的。我要添加的列与约束无关。我认为这可能是因为事实上OS400(i5/OS)并没有真正改变现有的表,而是创建了一个新表并在其中复制数据,这可能就是造成这种痛苦的原因。
但是,是否有一种方法可以挂起这些键,然后在更改之后恢复它们?
(不涉及使用SQL执行此操作或建议首先以不同方式创建表的答案没有帮助,因为它们在此处不适用…)