我在iSeries(IBM-I/AS400)上有一个有一些约束的表。该表是用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)并没有真正改变现有表,而是正在创建新的表并复制数据,这可能是痛苦所带来的。

但是,有没有办法可以暂停钥匙然后在Alter之后恢复它们?

(不涉及使用SQL进行此操作或建议创建表的答案首先是没有帮助的,因为它们在这里不适用...)

有帮助吗?

解决方案

答案是:我错过了这样一个事实,一个桌子上有一个外国钥匙指向该桌子的锁。或者,更直截了当:我是个白痴!

其他提示

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top