Oracleのテーブルの切り捨ては便利なコマンドです。これは、テーブル内のすべての行を削除し、テーブルに割り当てられたスペースを解放するために使用されます。切り捨てテーブルに関するいくつかの重要なポイントは次のとおりです
はテーブルの名前であり、テーブルの所有者であるか、テーブルを切り捨てるためにTABLEシステム権限をドロップする必要があります
-ストレージは、指定されていない場合でもデフォルトでドロップされます。スペースを節約したい場合は、ストレージを保持してから、ストレージを再利用できます
別のスキーマのテーブルを切り捨てる場合は、次のように使用します
Truncate table <owner>.<table name>
を切り捨てます
例
Truncate table EMP;
Truncate table SCOTT.EMP;
Truncate table SCOTT.EMP reuse storage;
Oracleでテーブルの切り捨てを許可する方法
Oracleにはテーブルの切り捨て特権はありません。 Oracleでテーブルの切り捨てを許可するには、テーブルの削除権限を提供する必要があります。テーブルをドロップすると、他の多くの特権が付属します。したがって、これはすべての場合に可能であるとは限りません。プロシージャを作成し、そのプロシージャの実行を許可することで、この課題を克服できます。例で理解しましょう
あるユーザーUSER1の切り捨てテーブルを別のユーザーUSER2に渡したいとします
テーブルを単純に切り捨てようとすると、エラーが発生します
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
それでは、手順とそれに特権を付与することで、このことを試してみましょう
Conn user1/pass
create or replace procedure trunc_t( p_table in VARCHAR2)
is
v_count pls_integer;
BEGIN
select count(*) into v_count
from user_tables
where
table_name = p_table;
if ( v_count = 1 )
then
execute immediate 'truncate table '|| p_table;
else
raise_application_error( -20001,
'table does not exists' );
end if;
END;
/
grant execute on trunc_t to user2;
Conn user2/pass
exec trunc_t('EMP');
に実行を許可します。
このようなことをしたくない場合は、テーブルの削除権限を付与する必要があります
conn system/<pass>
grant drop any table to user2;
テーブルカスケードの切り捨て
- Oracle 12cより前では、有効な外部キー制約の親テーブルを切り捨てることはできません。試してみると、 ORA-02266 。テーブルを切り捨てる前に、制約を無効にする必要があります。例外は、整合性制約が自己参照である場合にテーブルを切り捨てることができることです。
- Oracle 12c R1では、OracleはTruncateにCascade句を導入しました。 CASCADEを指定して、階層内のテーブルを再帰的に切り捨てることができるようにする必要があります。この句を省略し、そのような参照整合性制約が存在する場合、データベースはエラーを返し、テーブルを切り捨てません。例を使用して、この切り捨てられたテーブルをカスケードで理解しましょう
CREATE TABLE "EMP"
( "EMPNO" NUMBER(6,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0),
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO"),
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "DEPT" ("DEPTNO") ON DELETE CASCADE ENABLE
);
CREATE TABLE "DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
;
SQL> desc emp
Name Null? Type
----------------------------------------- -------- -----------------------
EMPNO NOT NULL NUMBER(6)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)SQL>
SQL> desc dept
Name Null? Type
----------------------------------------- -------- -----------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL>
insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK');
insert into dept values(20, 'RESEARCH', 'DALLAS');
insert into dept values(30, 'RESEARCH', 'DELHI');
insert into dept values(40, 'RESEARCH', 'MUMBAI');
insert into emp values( 7698, 'BLAKE', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 2850, null, 10 );
insert into emp values( 7782, 'CLARK', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 2450, null, 10 );
insert into emp values( 7788, 'SCOTT', 'ANALYST', 7566, to_date('9-6-2012','dd-mm-yyyy'), 3000, null, 20 );
insert into emp values( 7789, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 3000, null, null );
insert into emp values( 7560, 'T1OM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 20 );
insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, null );
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 01-MAY-07 2850 10
7782 CLARK MANAGER 7839 09-JUN-08 2450 10
7788 SCOTT ANALYST 7566 09-JUN-12 3000 20
7789 TPM ANALYST 7566 09-JUN-17 3000
7790 TOM ANALYST 7567 09-JUL-17 4000
4534 xyz 1000 20
4576 abc 1000
7560 T1OM ANALYST 7567 09-JUL-17 4000 20
SQL> truncate table dept;
truncate table dept
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by foreign keys
SQL>
SQL> truncate table dept cascade;
Table truncated.
これが機能するには、外部キー制約にONDELETECASCADEが必要であることに注意することが重要です。カスケードを使用したテーブルの切り捨ては、DEPTテーブルからデータを削除するだけでなく、EMPテーブルも削除することに注意することが重要です。
select * from DEPT;
no rows Selected
select * from EMP;
no rows Selected
oracle truncate table vs delete
切り捨て | 削除 |
テーブルからすべての行を削除します | テーブルから1つ以上の行を削除するために使用できます |
DDLコマンドであり、DELETEトリガーでは起動しません | DMLコマンドとFireONDeleteトリガー |
テーブルの最高水準点をリセットします | テーブルの最高水準点は変更されません |
ロールバックできません | ロールバックできます |
より高速 | 遅い |
ここで句を指定することはできません | Where句を指定できます |
セグメントに割り当てられたストレージを保持または削除するオプションがあります | このオプションはありません。ストレージは同じままです |
この投稿がOracleのテーブルの切り捨てに役立つことを願っています
関連記事
Oracleテーブルの作成
Oracleのテーブルサイズの確認
oracleすべてのテーブルの表示
Oracleのテーブルからの削除
https://docs.oracle.com/cd/B28359_01/server。 111 / b28286 / statement_10007.htm