Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

TRUNCATE TABLE (SQL)

テーブルからすべてのデータを削除し、カウンタをリセットします。

Synopsis

TRUNCATE TABLE [restriction] tablename

引数

引数 説明
restriction オプション — %NOCHECK、%NOLOCK、%NOJOURN の制約キーワードのうちの 1 つ、またはこれらのキーワードの空白で区切られたリスト。
tablename すべての行を削除するテーブル。テーブルのすべての行を削除できる更新可能なビューを指定することもできます。 テーブル名 (またはビュー名) は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。未修飾の名前は、スキーマ検索パス (指定されている場合) または既定のスキーマ名を使用して、そのスキーマと照合されます。

概要

TRUNCATE TABLE コマンドは、テーブルからすべての行を削除し、すべてのテーブル・カウンタをリセットします。テーブルの切り捨ては、直接またはビューを使用して行うことができます。ビューを使用してテーブルを切り捨てる場合は、CREATE VIEW で説明されている削除の必要条件や制限事項に従います。

TRUNCATE TABLE により、RowID フィールドIDENTITY フィールド、および SERIAL (%Library.Counter) フィールドの連続した整数値を生成するために使用される内部カウンタがリセットされます。InterSystems IRIS では、TRUNCATE TABLE に従ってテーブルに挿入される最初の行にこれらのフィールドの値 1 を割り当てます。テーブルのすべての行で DELETE を実行しても、これらの内部カウンタはリセットされません。

TRUNCATE TABLE は、データがストリーム・フィールドに挿入されるときにストリーム・フィールド OID 値を生成するために使用される内部カウンタをリセットします。テーブルのすべての行で DELETE を実行しても、この内部カウンタはリセットされません。

TRUNCATE TABLE%ROWCOUNT ローカル変数を常に -1 に設定します。%ROWCOUNT を削除された行数に設定することはありません。

TRUNCATE TABLE では ROWVERSION カウンタはリセットされません。

TRUNCATE TABLE は、DELETE 処理中にベース・テーブル・トリガの実行を抑制して、トリガが引き出されないようにします。TRUNCATE TABLE は %NOTRIGGER 動作によって削除を実行するため、TRUNCATE TABLE を実行するには、ユーザに %NOTRIGGER 特権が付与されている必要があります (GRANT 文を使用)。TRUNCATE TABLE はこの点で、機能的には以下と同一です。

DELETE %NOTRIGGER FROM tablename
Note:

DELETE コマンドは、テーブルからすべての行を削除するのにも使用できます。DELETETRUNCATE TABLE より多くの機能を提供します。これには、%ROWCOUNT に削除された行数を返す機能も含まれます。DELETE は内部カウンタをリセットしません。

TRUNCATE TABLE は、その他のデータベース・ソフトウェアからのコード移行との互換性を提供します。

テーブルを切り捨てるには、以下の条件を満たしている必要があります。

  • テーブルは、現在の (または指定された) ネームスペースに存在している必要があります。指定されたテーブルが見つからない場合、InterSystems IRIS は SQLCODE -30 エラーを発行します。

  • トリガが定義されていない場合でも、ユーザは %NOTRIGGER 管理者特権を持っている必要があります。この権限を持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザは %NOTRIGGE 特権を持っていません" に設定されます。

  • ユーザは、テーブルに対する DELETE 特権を持っている必要があります。この権限を持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザ 'name' は操作に対する特権を持っていません" に設定されます。%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが DELETE 特権を持っているかどうかを確認できます。$SYSTEM.SQL.Security.CheckPrivilege()Opens in a new tab メソッドを呼び出すことにより、指定のユーザが DELETE 特権を持っているかどうかを確認できます。特権の割り当てについては、"GRANT" コマンドを参照してください。

  • テーブルを READONLY として定義することはできません。読み取り専用テーブルを参照するTRUNCATE TABLE をコンパイルすると、SQLCODE -115 エラーが発生します。このエラーは実行時にのみ発生するのではなく、コンパイル時にも発生するようになったことに注意してください。"クラスの定義と使用" の "永続クラスのその他のオプション" の章で READONLY オブジェクトの説明を参照してください。

  • ビューから削除する場合、ビューは更新可能である必要があり、WITH READ ONLY として定義することはできません。これを実行しようとすると、SQLCODE -35 エラーが返されます。詳細は、"CREATE VIEW" コマンドを参照してください。

  • すべての行が削除可能である必要があります。既定では、1 行以上の行が削除不可能である場合、TRUNCATE TABLE 操作は失敗し、行は削除されません。

    テーブルが別のプロセスによって EXCLUSIVE MODE または SHARE MODE でロックされている場合、TRUNCATE TABLE は失敗します。ロックされているテーブルに対して TRUNCATE TABLE 操作を試行すると、SQLCODE -110 エラーになり、%msg は "テーブル 'Sample.MyStuff' の DELETE のための RowID = '3' に対するロックが取得できません" (指定された RowID はテーブルの最初の行です) になります。

    行の削除が外部キーの参照整合性に違反する場合、TRUNCATE TABLE は失敗します。行は削除されず、TRUNCATE TABLE は SQLCODE -124 エラーを発行します。この既定の動作は以下のように変更できます。

アトミック性

TRUNCATE TABLE は自動的に開始されたトランザクション内では発生しません。したがって、ジャーナリングやロールバック・オプションは提供されません。

ジャーナリングおよび TRUNCATE TABLE のロールバック・オプションが必要な場合、明示的に START TRANSACTION を指定し、明示的な COMMIT または ROLLBACK で終わる必要があります。

これは SET TRANSACTION %COMMITMODE= NONE または 0 (自動トランザクションなし) と同じです。TRUNCATE TABLE を呼び出してもトランザクションは開始されません。TRUNCATE TABLE 操作の失敗により、行の一部が削除されたり削除されなかったりすることで、データベースが整合性のない状態になる可能性があります。このモードでトランザクションのサポートを提供するには、START TRANSACTION を使用してトランザクションを開始し、COMMIT または ROLLBACK を使用してトランザクションを終了する必要があります。

シャード・テーブルの TRUNCATE TABLE は、明示的に SET TRANSACTION %COMMITMODE EXPLICIT を設定した場合であっても、常に SET TRANSACTION %COMMITMODE NONE を使用して実行されます。

制限引数

restriction 引数を使用するには、現在のネームスペースに対応する admin-privilege が必要となります。詳細は "GRANT" を参照してください。

restriction 引数を指定すると、以下のように処理を制限します。

  • %NOCHECK — 削除される行を参照する外部キーの参照整合性チェックを抑制します。

  • %NOLOCK — 削除される行の行のロックを抑制します。単独のユーザ/処理がデータベースを更新する際にのみ使用します。

  • %NOJOURN — 削除される行のジャーナリングを抑制し、削除中のトランザクションを無効化します。起動されたトリガを含め、行での変更はどれもジャーナリングされません。%NOJOURN が指定された文の後で ROLLBACK を実行した場合、その文で行われた変更はロールバックされません。

複数の restriction 引数を順不同で指定できます。複数の引数は、空白で区切られます。

親レコードの削除時に restriction 引数を指定すると、対応する子レコードの削除時に同じ restriction 引数が適用されます。

TRUNCATE TABLE は常に暗黙的な %NOTRIGGER 動作による削除を実行し、対応する admin-privilege を必要とします。

参照整合性

InterSystems IRIS では、システム全体の構成設定を使用して外部キーの参照整合性チェックを実行するかどうかが決まります。既定では、外部キーの参照整合性チェックを実行します。"外部キーの参照整合性チェック" の説明に従って、この既定値をシステム全体で設定できます。現在のシステム全体の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。

TRUNCATE TABLE 操作時には、すべての外部キー参照について、参照されるテーブルの該当する行に対する共有ロックが取得されます。この行は、トランザクションの終了までロックされています。これにより、参照される行は、TRUNCATE TABLE のロールバックがあってもそれより前に変更されることがなくなります。

トランザクションでのロック

InterSystems IRIS は、TRUNCATE TABLE 操作時に標準のロックを実行します。一意フィールドの値は、現行のトランザクションの間、ロックされます。

既定のロックしきい値は、テーブルごとに 1000 ロックです。つまり、トランザクション時にテーブルから 1000 を超える一意フィールド値を削除する場合は、ロックしきい値に到達し、InterSystems IRIS はロック・レベルを自動的に一意フィールド値ロックからテーブル・ロックへと上げます。これによってトランザクション時に、ロック・テーブルをオーバーフローすることなく、大規模な削除を実行できます。

現在のシステム全体のロックしきい値は、$SYSTEM.SQL.Util.GetOption("LockThreshold")Opens in a new tab メソッドを使用して確認できます。このシステム全体のロックしきい値は、以下の方法を使用して設定できます。

  • $SYSTEM.SQL.Util.SetOption("LockThreshold")Opens in a new tab メソッドを使用します。

  • 管理ポータルを使用する。[システム管理][構成][SQL およびオブジェクトの設定][SQL] の順に移動します。[ロック・エスカレーションしきい値] の現在の設定を表示して編集します。

ロックしきい値を変更するには、%Admin Manage Resource の USE 許可が必要です。InterSystems IRIS は、ロックしきい値の変更を現在のプロセスすべてに即座に適用します。

トランザクションでのロックの詳細は、"InterSystems SQL の使用法" の “データベースの変更“ の章にある "トランザクション処理" を参照してください。

インポートされた SQL のコード

ImportDDL("IRIS")Opens in a new tab および Run()Opens in a new tab メソッドは TRUNCATE TABLE コマンドをサポートしません。これらのメソッドによってインポートされた SQL コード・ファイルの TRUNCATE TABLE コマンドは無視されます。これらのインポート・メソッドは DELETE コマンドをサポートします。

以下の 2 つのダイナミック SQL の例では、DELETETRUNCATE TABLE を比較しています。それぞれの例では、テーブルを作成し、テーブルに行を挿入し、テーブル内のすべての行を削除してから、空になったテーブルに単一の行を挿入しています。

最初の例では DELETE を使用して、テーブル内のすべてのレコードを削除します。DELETE は RowID カウンタをリセットしないことに注意してください。

  SET tcreate = "CREATE TABLE SQLUser.MyStudents (StudentName VARCHAR(32),StudentDOB DATE)"
  SET tinsert = "INSERT INTO SQLUser.MyStudents (StudentName,StudentDOB) "_
                "SELECT Name,DOB FROM Sample.Person WHERE Age <= '21'"
  SET tinsert1 = "INSERT INTO SQLUser.MyStudents (StudentName,StudentDOB) VALUES ('Bob Jones',60123)"
  SET tdelete = "DELETE SQLUser.MyStudents"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(tcreate)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName,!

   NEW %ROWCOUNT,%ROWID
   SET qStatus = tStatement.%Prepare(tinsert)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName," rowcount ",rset.%ROWCOUNT,!

   SET qStatus = tStatement.%Prepare(tdelete)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName," rowcount ",rset.%ROWCOUNT,!

  SET qStatus = tStatement.%Prepare(tinsert1)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName," rowcount ",rset.%ROWCOUNT," RowID ",rset.%ROWID,!
  &sql(DROP TABLE SQLUser.MyStudents)

2 番目の例では TRUNCATE TABLE を使用して、テーブル内のすべてのレコードを削除します。%StatementTypeNameOpens in a new tabTRUNCATE TABLE に対して “DELETE” を返すことに注意してください。TRUNCATE TABLE は RowID カウンタをリセットすることに注意してください。

  SET tcreate = "CREATE TABLE SQLUser.MyStudents (StudentName VARCHAR(32),StudentDOB DATE)"
  SET tinsert = "INSERT INTO SQLUser.MyStudents (StudentName,StudentDOB) "_
                "SELECT Name,DOB FROM Sample.Person WHERE Age <= '21'"
  SET tinsert1 = "INSERT INTO SQLUser.MyStudents (StudentName,StudentDOB) VALUES ('Bob Jones',60123)"
  SET ttrunc = "TRUNCATE TABLE SQLUser.MyStudents"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(tcreate)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName,!

  NEW %ROWCOUNT,%ROWID
  SET qStatus = tStatement.%Prepare(tinsert)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName," rowcount ",rset.%ROWCOUNT,!

  SET qStatus = tStatement.%Prepare(ttrunc)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName," (TRUNCATE TABLE) rowcount ",rset.%ROWCOUNT,!

  SET qStatus = tStatement.%Prepare(tinsert1)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
   WRITE rset.%StatementTypeName," rowcount ",rset.%ROWCOUNT," RowID ",rset.%ROWID,!
  &sql(DROP TABLE SQLUser.MyStudents)

関連項目

FeedbackOpens in a new tab