• ベストアンサー

truncate文を発行したときに

データベースのすべての表をけしたくてSQLPLUSでTRUNCATEしようとするんですが、 表には使用可能な外部キーによって参照される一意キー/主キーが含まれています。 というエラーメッセージがでることがあります。 DBA STUDIOですとテーブル名を選択してDELキーですんなり消せるのですが・・・。 キーの参照設定とかを消したりすればよいのでしょうか? 具体的には、TRUNCATEを行う前にどのようなSQLPLUSコマンドを打てばいいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

alter table テーブル名 disable constraint 参照整合性制約名; でdisableにしてからtruncateで実行できるはずです。 終わったら alter table テーブル名 enable constraint 参照整合性制約名; でenableにします。 #すべての表を消すのであればUSER_CONSTRAINTSのCONSTRAINT_TYPEが'R'(参照整合性)ですべての制約を取得してdisableにすればよいと思います。 >DBA STUDIOですとテーブル名を選択してDELキーですんなり消せるのですが・・・。 DBA STUDIOはおそらくdeleteをしていると思います。

msndance
質問者

お礼

>DBA STUDIOはおそらくdeleteをしていると思います。 有無をいわさず消してくれるDELETEというSQL文があるということでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • ppg-2
  • ベストアンサー率39% (77/193)
回答No.1

通常、外部参照しているほうを先にtruncateすればいいと思います。 相互参照になっている場合はindexなどの制限をdropしたあと削除しcreateする方法でしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • truncate文で全テーブルを一気に削除できるか?

    さきほどと似たような質問ですみません。 SQLコマンドであるデータベースの全テーブルを削除したいんですが、 truncate一文ですませる方法はないでしょうか。 それとも、一行ずつ truncate tableA truncate tableB .... とやっていくしかないのでしょうか?

  • DBの全ユーザーテーブルに対するtruncate

    PostgreSQLを勉強中の者です。 データベースの全ユーザーテーブルに対して、個別にtruncateをかけるいい方法を探しています。  \pset pager  \dt 以上のコマンドを実行して、テーブル一覧を表示できることをはわかったのですが、ここから先の妥当なやり方がわかりません。 リダイレクトして、テキストエディタで加工して、シェルのようなもので流し込む・・・のような形になるのでしょうか? 実例も含めて教えていただけると助かります。 また、truncateされたことの上手い確認方法もあれば御教示下さい。 よろしくお願いします。

  • ShellからTruncate【Linux】

    現在、ShellでSQL*PLUSを起動し、 テーブルをTruncateしようとしているのですが、 直接コマンドで実行すると可能なんですが、Shellで実行すると接続してすぐに切断されSQLが実行されません。 <Souce> ora_pass=TEST/TEST@DB log_pth=/home/oracle/TEST/04_log/ scrLOG=${log_pth}SHELL.log echo "S" sqlplus $ora_pass <<EOF > $scrLOG truncate table W_BSL_INV; EOF echo "E" ちなみにSelect文はscrLOGに正常に出力されます。

  • TRUNCATEの権限設定について

    現在、phpおよびPostgreSQLを使用して WEBアプリケーションを開発しています。 その中で、あるテーブルのデータを一括削除するために TRUNCATEを使用したいと思い、以下のようにTRUNCATE権限を設定しようと したところ以下のエラーになりました。 ERROR: unrecognized privilege type "truncate" truncateタイプの権限設定が認められていない感じのエラーでしょうか。 ちなみに、テーブル作成および権限設定はphpPgAdminを使用して行いました。 SQLは以下の通りです。 CREATE TABLE stock_tbl ( cc_no int, course_no int, date int, time_no int, status int NOT NULL DEFAULT 0, del_flg int NOT NULL DEFAULT 0, create_dt timestamp NOT NULL DEFAULT now(), update_dt timestamp NOT NULL DEFAULT now(), PRIMARY KEY (cc_no, course_no, date, time_no) ); REVOKE ALL ON stock_tbl FROM admin; GRANT SELECT, UPDATE, INSERT, DELETE, TRUNCATE ON stock_tbl TO admin; 環境は以下の通りです。 サーバーはCentOS5.5 PostgreSQLのバージョンは8.1.23 phpPgAdminのバージョンは4.1.3 バージョンなどの問題でTRUNCATEの権限を設定できないのかなと思い 色々調べてみたのですが、解決に結びつくものが見当たりませんでした。 なんとか、上記テーブル、ユーザーにTRUNCATEの権限を与えたいのですが どのように設定を行えばよろしいでしょうか? 補足ですが、PostgreSQLのバージョンが8.1.22で 上記テーブルに何の特権も設定せずにアプリケーションでTRUNCATEを 実行してもエラーになりませんでした。 どなたか、上記に関してアドナイスをいただけないでしょうか? よろしくお願いいたします。

  • 外部キーだけのテーブル(主キーがない?)

    データベースのテーブルについておたずねします. 主キーがなくて,そのかわりに外部キー(と主キー以外の列)しか持たない テーブルも可能だと聞きました. テーブルには主キーが必ずあるものだと思っていましたが, どのような使いかたをするのでしょうか. どうやら,最初からデータがあるわけではなく, 追加されるタイミングがわからないデータを格納する場合に作っておく, ということらしいのですが,なんのことかよくわかりません. データベース関連書籍をいくつか調べましたが, 主キーのないテーブルの説明などは見当たりません. また,この悩ましい問題を与えてくれた知り合いに訊ねましたが, テーブル構成などの具体的なことは, 企業内のことなので,教えてもらえませんでした. 何か具体的な例を交えながらご説明いただければと思います.

  • データベースリンクについて

    Oracle8.1.7のデータベースリンクについて質問があります。 Createしたデータベースリンクを、DBA Studioでテストすると、「データベースリンクはアクティブではありません。」と言われます。 Create後に何かアクティブにするコマンド等があるのでしょうか? 下記に、Createしたコマンドを記述します。 CREATE DATABASE LINK データベースリンク名 CONNECT TO 指定ユーザ IDENTIFIED BY パスワード USING '参照サーバ';

  • XMLで主キーを自動的に入力する方法

    VB.NET2005で家計簿を作っています。 データの保存はXMLで行いたいと考えています。 DataSetにshishutuテーブルとShopテーブルをつくり、shishutuテーブルにはShopテーブルの主キーのデータを格納することで二つのテーブルを連携したいと考えています。 そこでデータ入力時に自動的に主キーを入力したいと思うのですが、Accessのようにオートナンバー型などがないので、一意のデータをどのように入れたらいいか悩んでいます。 Rows.Countでは、データを削除するとデータが重なるなど不具合も出てくるのではないかと思っています。 そこで 1. いつ、どの時点で 2. どのようなプロパティを参照にして 3. 一意のデータを作ればよいか? についてやもしくは「そもそもXMLでは主キーを自動的に入れることは不向きで別に良い方法がある」などのご意見を伺いたいと思います。 なにか良い知恵がありましたらよろしくお願いします。

  • テーブルのアイテム番号を一意にするには?

    今PHPとデータベースを使ってメールの送受信をするというものを作っています。 テーブルの主キーはu_id(そのメールを送信または受信したユーザ)と、m_id(一意のメールの番号)です。 m_idに一意の番号をつけていくにはどうしたらいいのでしょうか? ・メールを削除することも出来ます。 ご回答の程よろしくお願いします。

    • ベストアンサー
    • PHP
  • Oracle 参照用ユーザー作成

    Oracle 9i で新規で参照専用のユーザーを作成しています。 が、うまく作成できなかったため質問したいと思います。 現在、下記のようなデータベース、ユーザー名となっています。 データベース :A ユーザー :A これに対して、以下のユーザーを作成しました。 ユーザー :B ロール :CONNECT システム権限 :select any table execute any procedure この状態で、データベースAに対してユーザーBへ接続はできますが、 SELECT文を実行しても、”ORA-00942:表またはビューが存在しません”メッセージが表示されます。 そこで、BのロールをDBAにしたり、オブジェクト権限に、データベースAの表に対して 使用可能な権限としてSELECTを指定したりしたのですが、やはり同様のメッセージが表示されました。 データベースAの表を見れていない状況だと思うのですが、どのように、Aの表を参照するよう 設定してやるのかがわかりません。 何が不足しているのかご教授下さい。 よろしくお願い致します。

  • ASP.NET:複数結合テーブルのデータ変更方法について

    ASP.NET:複数結合テーブルのデータ変更方法について こんにちは。 現在Visual Studio2008(ASP.NET、ADO.NET) +SQL Server2005 Stdの環境でデータベースを参照したWebアプリケーションを作成しています。 GridViewを使い、データベースの内容を表示し、修正や追加、削除を行いたいと思っています。 (SQLのUpdate,Insert,Deleteに該当) 主キーが設定された単独のテーブルに対しては、GridView内のデータソースでデータベースを選び、 該当のテーブルを選択。その後「INSERT,UPDATEおよびDELETEステートメントの作成」オプションを選ぶことでこれらの変更方法が簡単に実装できるのを確認しております。 しかし、主キー外部キーの関係を持つ2つ以上のテーブルを結合したものに関してこれらの変更を行う場合は通常どのようにするのでしょうか。 何かヒントになるキーワードや参考になるコードを教えていただけないでしょうか? 単独のテーブルの時と同じく、結合したテーブルデータ(ビューに該当)をGridViewに表示し、そのGridView上で変更を行いたいと思っています。 SQL Server側でこれらのテーブルを結合したViewを作成し、これを選ぶことでGridViewに表示する事が可能なのは確認したのですが、やはり「INSERT,UPDATEおよびDELETEステートメントの作成」オプションは選択できませんでした。 以上よろしくお願いいたします。