1

いくつかの制約がある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でこれを行う必要がない、またはそもそもテーブルを別の方法で作成することを提案する回答は、ここでは適用できないため、役に立ちません...)

4

2 に答える 2

4

答えは次のとおりです。テーブルの1つに、そのテーブルを指す外部キーを持つロックがあったという事実を見逃しました。または、もっと率直に言って、私はばかです!

于 2010-08-27T23:04:54.350 に答える
0

参照制約を有効または無効にすることは役立ちますか?

于 2010-08-27T22:51:16.817 に答える