![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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ランキング
-
警察はスマホに保存した動画や...
-
データベースファイル(.db)を開...
-
Access フォーム上でコンボボッ...
-
AccessのSQLで、FROM句の構文エ...
-
私はシステム会社に務めている...
-
エクセルのフィルタ抽出が固まる
-
式を簡単にしてください。ACCES...
-
Notion@リレーション値の取得...
-
SQLデータベースへのリンクがあ...
-
シャープレジスター エラーコード
-
顧客データベースを作る場合、...
-
データベースの選定について 要...
-
ドリームメーカーってどうやっ...
-
Accessのフォームへ、記録者の...
-
エクセル
-
コンピュータ用語、データベー...
-
コンピュータ
-
ファイルが壊れて読み取れませ...
-
旧filemakerで和暦(令和など)...
-
QSL でのフォーム画面作成について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
列が存在しないと言われる
-
0の除算
-
constraint と index の違い
-
DBから日付順に指定件数の削除...
-
alter tableすると、処理が止ま...
-
PostgreSQLで表結合+DELETEしたい
-
INSERTできるレコード数を制限...
-
COPY時のtimestamp型について
-
長いSQL文を実行するには?
-
RDB経験者向けのAccess参考書
-
Null値を無視してユニークにしたい
-
大量データを更新したら、処理...
-
INSERTできない
-
SQLite:項目が存在しない場合の...
-
powergres(postgres)にalter文...
-
DB2でUNIQUE制約を削除したい
-
SQLで特定データがNULLなら別デ...
-
【初歩】 主キー&ユニーク&AU...
-
DB2 「既存カラムへのnot null...
-
副問い合わせ
おすすめ情報