![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
DB2で以下のように明示的な名前のないUNIQUE制約を削除したいのですが、よい方法をご存じの方がおられましたらご教授ください。
(例)
1. 表の作成
CREATE TABLE TEST ( COL1 INT NOT NULL)
2. 明示的な名前を作成せずにUNIQUE制約を作成
ALTER TABLE TEST ADD UNIQUE (COL1);
上記のように名前指定しなかったUNIQUE制約を
ALTER TABLE文で削除したいのですが、どのように
すればよろしいのでしょうか?
マニュアルの構文では制約名を指定する必要あるようで、
syscat.tabconstカタログで自動でつけられた制約名を調べた後、
以下のように指定したところ制約は削除されました。
(例)
ALTER TABLE TEST DROP CONSTRAINT SQL090123084403480
しかしプログラムの修正が少なくなるよう、制約名を調べずにALTER TABLE 一文で削除できないものかと悩んでおります。
もしくはストアドプロシージャでも構いません。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
OS名、DB2のバージョンは、何でしょうか?
>DB2のストアドプロシージャでは動的にDDL文を組み立てて実行することができないよう
ちょっと信じがたいのですが、「EXECUTE IMMEDIATEの実行不可」と言ってますか?
別にストアドプロシジャじゃなくても、いいのですよ。
システムカタログを検索して、テキストファイルに書き出すのでもいいのです。
書き出すときに、
'ALTER TABLE TEST DROP CONSTRAINT "'
検索で得た制約名
'";'
を文字列で組み立てて、ALTER TABLE文を作ればいいのです。
これを実行すれば、目的は達成できませんか?
この回答への補足
chukenkenkouさん、
回答いただき、ありがとうございます。
環境はDB2/LINUX 8.2.7 です。
前提として、保守用のSQLテキストスクリプト内にSQL文を記述して実行
しているので、制約名を知らべてから動的にSQL文を組み立てて実行、という処理が保守用のSQLテキストスクリプト内で完結できるかどうか調べていました。外部のプログラム言語は使わないというのが前提です。
もし"EXECUTE IMMEDIATE"で動的SQLの実行が、SQLのストアドプロシージャか、BEGIN ATOMIC - END で呼び出しで使用できるなら可能かもしれませんが、ちょっと無理そうだったので。。。
そろそろタイムリミットなので、Javaでシステムカタログを検索してから、ALTER文を実行というように保守用のプログラムを作ろうと思っています。
もしも、そんなことせずに、テキストのSQLスクリプトだけでできる!という方法をご存じでしたらよろしくお願いします。
JAVAプログラムで制約名を取得してから、ALTER TABLE文を作成して実行する方法で解決しました。
どうもありがとうございました。
No.1
- 回答日時:
DB2に限った話ではないですが、一般的な考え方としては、次のどちらかでは?
(1)制約名を明示的に付ける。
(2)制約名を意識したくないなら、システムカタログを検索して名称を得て、ALTER PROGRAM文を文字列で生成し、実行するストアドプロシジャを作る。
この回答への補足
ご指摘のとおり、新規のシステムには制約名を明示的につけているのですが、古いシステムにかなりの数の制約が名前なしで生成されているのです。
DB2のストアドプロシージャでは動的にDDL文を組み立てて実行することができないようなので困っていました。
もし、DB2で動的にDDLを実行できる方法あればご教授いただける助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- MySQL テーブル作成時のカラムについて 2 2022/08/27 21:48
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
列が存在しないと言われる
-
0の除算
-
PostgreSQLで表結合+DELETEしたい
-
動的に生成したカラムを使ったF...
-
RDB経験者向けのAccess参考書
-
INSERTできない
-
複数キーワードでのあいまい検索
-
DB2でUNIQUE制約を削除したい
-
COPY時のtimestamp型について
-
INSERTできるレコード数を制限...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Access テキスト型に対する指定...
-
「直需」の意味を教えてください
-
Accessでテーブル名やクエリ名...
-
Accessでテーブルの値をテキス...
-
必須入力項目と入力必須項目
-
Accessのフィールド数が255しか...
-
【Access】フォームで自動計算...
-
Accessでコードを入れると名前...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
列が存在しないと言われる
-
0の除算
-
constraint と index の違い
-
INSERTできるレコード数を制限...
-
長いSQL文を実行するには?
-
PostgreSQLで表結合+DELETEしたい
-
alter tableすると、処理が止ま...
-
COPY時のtimestamp型について
-
DBから日付順に指定件数の削除...
-
動的に生成したカラムを使ったF...
-
SQLで特定データがNULLなら別デ...
-
複数キーワードでのあいまい検索
-
■一番最初に値が入っている(Nul...
-
postgreSQLの日付を変数にする...
-
PostgreSQLで、元テーブルをコ...
-
SQLite:項目が存在しない場合の...
-
INSERTできない
-
powergres(postgres)にalter文...
-
SQL における変数の宣言と代入...
-
大量データを更新したら、処理...
おすすめ情報