2017-02-02 23 views
0

テーブルから外部キーを削除したいが、その識別子がわからない。外部キーの削除(CONSTNAME)

SYSCAT.KEYCOLUSE表からIDを取得します。

その後、私はその識別子を使用してFKを削除しようとします。

識別子

SELECT keycoluse.CONSTNAME FROM SYSCAT.KEYCOLUSE keycoluse WHERE TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE' 

結果を取得= ID000000001

ドロップFK

ALTER TABLE TABLE1 
DROP FOREIGN KEY (SELECT keycoluse.CONSTNAME FROM SYSCAT.KEYCOLUSE keycoluse WHERE TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE'); 

このスローエラー:[エラーコード:-104、SQL状態:42601]

しかし、このように前に取得した識別子を使用すると、それは動作します:

0123このように、それは動作しません
ALTER TABLE TABLE1 
DROP FOREIGN KEY ID000000001; 

ALTER TABLE TABLE1 
DROP FOREIGN KEY 'ID000000001'; 

私はIDを取得するためにSELECTを実行すると、それはvarchar型「ID000000001」を取得し、それがエラーになります。

¿このコマンドで使用しているのと同じ型にSELECTの結果をキャストする方法はありますか?

ALTER TABLE TABLE1 
DROP FOREIGN KEY ID000000001; 

答えて

0

識別子が必要な変数(副選択によって返される)またはリテラルを使用することはできません。

SELECT 
    'ALTER TABLE', 'TABLE1', 
    'DROP FOREIGN KEY', keycoluse.CONSTNAME 
FROM 
    SYSCAT.KEYCOLUSE keycoluse 
WHERE 
    TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE' 

クエリ意志:あなたあなたは、単一の制約を削除するために、このような複雑なアプローチを使用する理由私は想像することはできませんが、あなたが持っているクエリからスクリプトを生成です何ができるか

正しいALTERステートメントを返します。あなたは/あなたの好きなクライアントソフトウェアに貼り付けたり、テキストファイルに結果を書き込むコピーし、それを実行することができ、例えば、

db2 -f mydropscript.sql 
+0

と私はスクリプトのこれらの種類を使用すると、一般的に適切なアプローチであることを言及する価値があると思いますが、より大きな変更を加えるとき。それらを使用することからあまりにも甘やかされるべきではありません。 – gregory

+0

ありがとう、それは私のために働いた。 – Onefra

関連する問題