• ベストアンサー

DELETE文とTRUNCATE文の違いについて

こんにちは 現在ORACLE Bronzeの勉強をしていて、妙に引っかかる部分があるので質問をさせて下さい。 インプレスジャパンが刊行しているBronze DBA10gの問題集の中に以下のような問題があります。 次の中でDDL文では実現できない機能を2つ選びなさい。 A.ユーザーの作成 B.表の削除 C.データ変更の確定 D.ビューの名称変更 E.表データの削除 解答はC・Eだったのですが、ここで頭に?が浮かびました。 TRUNCATE文で表データの削除できるんじゃないの?というものです。 一般にTRUNCATE文の説明には「表の切捨て」や「表データの切捨て」という言葉を使っていますが、以下が質問になります。 1.「表データの削除」と「表データの切捨て」はまったく違う現象なのか。どう違う現象なのか。 2.結局TRUNCATE文も表のデータを削除してるのではないのか。 以上です。 質問が長くなってしまい申し訳ありませんでした。 認識違いなどありましたらご指摘ください、よろしくお願いします。 参考:http://www.thinkit.co.jp/free/tettei/1/3/1/ の第2問に同じ問題が載っています。

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

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

>1.「表データの削除」と「表データの切捨て」はまったく違う現象なのか。どう違う現象なのか。 DML(データ操作言語)の削除とDDL(データ定義言語)の削除とは、全然違います。敢えて対応付けるとすれば、以下のようになるかと。 「表データの削除」→DELETE[DML] 「表の切り捨て」(全ての表データを削除)→TRUNCATE[DDL] 「表の削除」→DROP[DDL] 一般的に、DML[Data Manipulation Language]ではデータベース内のデータに関する操作を行いますが、DDL[Data Description Language]ではスキーマ・オブジェクト(表、ビュー、インデックスなど)に関する操作を行います。よって、Oracleデータベースにおいては、「表データの切捨て」という表現は、おかしくて有り得ないものだと思います。用は、「切り捨て」という言葉は、DDLの中のTRANCATEだけに使用されている言葉だと考えていればいいと思います。 >2.結局TRUNCATE文も表のデータを削除してるのではないのか。 同じ「削除」でも、内部的には以下のような違いがあります。 DELETE→ ・ロールバックが可能。 ・記憶領域(エクステント)は開放せず。 TRANCATE→ ・ロールバックは不可能。 ・記憶領域(エクステント)は開放される。 ・しかし、表構造は残る。 で、表構造まで削除したい場合は、DROPを行います。

aoi2008
質問者

お礼

回答ありがとうございます。 大変参考になりました。 「表データの切捨て」という言葉は、同じく問題集の中で使われていた言葉でした。 DDL文を発行した結果、暗黙COMMITがおまけにあるように、 TRUNCATE文を発行した(表を切り捨てた)結果、表データの削除がおまけにある。 というニュアンスで大丈夫ですかね。 本件とはそれますが、DDLってDate Definition Languageじゃないんでしたっけ。

その他の回答 (6)

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.6

補足 正直なところ出題される問題が不正確だとは思いますが (この手の不正確な情報は試験に限らず良くあることです) > 次の中でDDL文では実現できない機能を2つ選びなさい。 「すべて選びなさい」ではなく「2つ選びなさい」という点からみて 可能性はCとEしかありません。よって許容範囲内かとは思います。 既に書かれていますが、ひねくれるとDDLの暗黙コミットによって選択Cも可能ですし。

aoi2008
質問者

お礼

回答ありがとうございます。 TRUNCATEも削除なんですね。 リファレンスは見ていませんでした。 確かに言われてみれば、 >>既に書かれていますが、ひねくれるとDDLの暗黙コミットによって選択Cも可能ですし。 なんですね。 そこまでは考えてませんでした。 やはり問題は問題として割り切りも必要ですね・・・。 言い訳になりますが、正しい知識を身につけたいと思っていたので、ここで質問させて頂きました。 決して捻くれてたわけじゃないんですよ(笑) どうもありがとうございました。

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.5

SQLマニュアルを見ればわかりますが ---- TRUNCATE を使用すると、表またはクラスタからすべての行を削除できます。 デフォルトでは、次の処理も実行されます。 削除された行が使用していたすべての領域(ただし、MINEXTENTS 記憶域パラメータで指定された領域は除く)の割当てが解除されます。 ・・・・・ ---- と書かれているので行の削除が主な機能と考えられます。 掲載先に問い合わせてみては如何ですか? ぜひ、回答を聞いてみたいところです。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.4

1.「表データの削除」と「表データの切り捨て(truncate)」ではかなり違います。  ・TRUNCATEはDROP TABLE権限がないと実行できない  ・エクステントを開放してハイウォータマークをリセットする  ・暗黙のCOMITTを行い、それまでのトランザクションを終了させる  ゆえに、「TRUNCATE」は「DDL」の一種と言っていいでしょう。 2.TRUNCATEは表データをいちいち見て削除していません。  あくまで領域を開放する動作をおこないます。  そのため、「DELETE」と違い、ROLLBACKができません。

aoi2008
質問者

お礼

回答ありがとうございます。 なるほど、自分の認識不足でした。 DELETE文を使った「表データの削除」は データを削除し、ハイウォータマークは変更しない。 TRUNCATE文を使った「表データの切捨て」は データ領域を解放し、ハイウォータマークを変更する。 表からデータが消えるのは、その副産物。 一般的にTRUNCATE文を発行した結果も、"データの削除"と呼んでいるので、ごっちゃになりやすい。という認識で間違いないでしょうか?

  • dyna_1550
  • ベストアンサー率34% (122/353)
回答No.3

微妙な表現で紛らわしいと思いますが、解答がC,Eというところから 考えると(ズルイですが)・・・ Delete は where が使えるのに対し、 Truncate は、where が使えません。 全量削除のみです。 「表データの削除」は、「(任意の)表データの削除」という意味では?

aoi2008
質問者

お礼

回答ありがとうございます。 (任意の)がついていれば確かに納得できますね。 ただ文面を見ただけではそれが分からないので、もしそういう意図で作ったのであれば問題製作側のミスになりますね。。。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

#Oracleはよく知りませんが(汗 一般的にはtruncateは「削除」に含めないですね。条件指定出来ないとかは抜きにしても、ログがないので「元の状態に戻せない」ことが大きいと思います。drop→createのようなものですから。

aoi2008
質問者

お礼

回答ありがとうございます。 仰るように「元の状態に戻せない」というのが分かれ目なのかな、と考えもしました。 でも、DROP TABLE は"表の削除"ですがROLLBACKはできないよな~。 とか考えてたら、やっぱり分からないままでした。 その辺はどうお考えですか? # 元の状態に戻せない ≠ ROLLBACKできない ですか・・・?

  • ese_ee
  • ベストアンサー率48% (68/139)
回答No.1

DELETE と TRUNCATE TABLE の違い http://www.shift-the-oracle.com/inside/delete-truncate-difference.html をどうぞ。

参考URL:
http://www.shift-the-oracle.com/inside/delete-truncate-difference.html
aoi2008
質問者

お礼

回答ありがとうございます ご紹介いただいたサイトは自分で調べる段階で閲覧しました。 しかしこのサイト内の説明は、自分の満足のいく解説ではありませんでした。 1.DELETEの「削除」とTRUNCATEの「切捨て」という単語をそもそも使っていない。(どちらとも削除) 2.TRUNCATE文の紹介で「非常に高速にデータを削除することができる。」とあるように、"データを削除する"という点ではDELETE文と違いがないと受け取れた。 なので、サイトを見ただけでは質問に書いた問題の答えにEが含まれる理由が分かりませんでした。

関連するQ&A