• 締切済み

DELETEとTRUNCATEの違い

montage_goの回答

回答No.2

表立った特徴はこんな感じでしょうか? TRUNCATE ・全件対象で削除。 ・ROLLBACKにて処理の取り消しが不可能。 ・DELETE文より高速。 DELETE ・WHERE文にて条件を記述し、一部のレコードのみ削除が可能。 ・ROLLBACKにて処理の取り消しが可能。 ・TRUNCATEより時間がかかる。

関連するQ&A

  • 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問に同じ問題が載っています。

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

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

  • バッチファイルでTRUNCATE TABLE

    バッチファイルでTRUNCATE TABLEするにはどうしたら良いのでしょうか? バッチファイルからSQL文を発行するやり方がわかりません。

  • 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に正常に出力されます。

  • SQL2000でのTRUNCATE TABLE

    お世話になります、AccessからSQL2000に接続し、 TRUNCATE TABLEを使いテーブルのデータをクリアしたいのですが、どのようにしたらよろしいのでしょうか。御存知の方がいらっしゃいましたら御教授ください。よろしくお願いします。

  • SQLServer DELETE 件数取得

    COBOL上(NETExepress5.0)にSQL構文を埋め込んでプログラムを作っています。 DELETE文を発行して、そのDELETE件数を取得して、DISPLAY文に表示したいのですが、 どのようにすればよいでしょうか。 DELETE文(COBOL文中) 例)  EXEC SQL DELETE FROM テーブル名  END-EXEC 先にSELECT COUNT(*) FROM テーブル名 とかしてもかまわないです。 よろしくお願いします。

  • pgAdmin IIIでDELETEするためには・・(初心者です)

    pgAdmin IIIで新しいテーブルを作りSQL文の勉強をしているのですが、 DELETE文が実行できません。 ○○というテーブルにある×××という項目が1と2という数値の場合その行を削除するという場合、 DELETE ○○ WHERE ××× IN (1,2) で良いのでしょうか? ○○、×××ともに日本語でテーブルを作っています。 pgAdmin IIIの設定は特にいじっていません。 とりあえずテーブルを作ってSQL文を試したいと思ってやっているので、 DELETE文を実行する権限がないということはあるのでしょうか?

  • 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を 実行してもエラーになりませんでした。 どなたか、上記に関してアドナイスをいただけないでしょうか? よろしくお願いいたします。

  • 大量レコードをTRUNCATEせずにすばやく削除する方法

    大量レコードをTRUNCATEせずにすばやく削除する方法 100万レコードあるテーブルのうち1万レコードを残して削除したい。TRUNCATEではWHERE句が指定できないので不可。DELETEでは遅すぎる。何かいい方法はないでしょうか? 1万レコードを一時テーブルに退避してTRUNCATE後に1万レコードをINSERTというのは無しです。1万レコードが1秒でもテーブル上から消えてはいけません。 Oracle10g

  • delete[]と、delete演算子の明確な違いとその使い分けについて

    C++の delete[]と、delete演算子の明確な違いとその使い分けについて 型* ptr = new 型[要素数]; でnewしたものについては、 delete[] ptr; にて、開放 型* ptr = new 型(); でnewしたものは、 delete ptr; するものだと、覚えてました、 特に深くは考えていなかったのですが。 std::auto_ptr<T> では、内部的には、delete[]ではなく deleteをしているという文章を見ました。 { std::autoptr<型A> iptr; iptr = new 型A; } のようなときは いいのですが・・・ { std::auto_ptr<char> cptr; cptr = new char[n+1]; } のようなときは、 動的配列なので、内部的に delete ptr; になってしまいます。 このように、テンプレートクラスを自作するときに 実際の特殊な型が決定されるまで、 deleteで、いくのかdelete[]でいくのか決定できないのはつらそうです。 そこで、deleteと、delete[]の正しい意味を 知りたいのですが。 Javaや、.NETには、配列オブジェクトというものが あります。 C++で、 new char[n+1]; は配列オブジェクトでしょうか? だとすると、delete[]は 右に来たものが配列オブジェクトなら、 Lengthを(こんなものがあるとして)調べて 1つづつ、まわして、deleteのほうを使ってひとつひとつ開放していく。 右に来たものが配列オブジェクトでなければ deleteと同じ振る舞いをする。 という動きが物理的に考えれそうで。 delete[]と書いておけば、状況に応じて、 動的配列なら全要素サーチして、開放そうでなければ deleteという風に、勝手に自動でそうしてくれるなら、 どんなときでも、delete[]にするようにコードを書いておけばよさそうです。。 実際のところどうなんでしょうか? deleteと、delete[]の明確な意味の違いと、 使用方法の違いについて教えてください。