Truncate Table v Oracle je užitečný příkaz. Používá se k odstranění všech řádků v tabulce a uvolnění místa přiděleného tabulce. Zde jsou některé důležité body týkající se tabulky Truncate
- Můžeme použít zkrátit tabulku smaže všechny řádky v tabulce a uvolní veškerý úložný prostor přidělený tabulce. Resetuje značku nejvyšší hladiny u stolu
- Tento příkaz nelze vrátit zpět
- Pro provedení operace byste měli být vlastníkem tabulky
- Zkrácení tabulky je příkaz DDL a nespouští spouštěče při odstranění
- Všechny řádky v tabulce můžeme smazat také příkazem delete, ale neuvolní se tím úložný prostor přidělený tabulce
- Když zkrátíte tabulku, Oracle Database automaticky odstraní všechna data z indexů tabulky a veškeré informace INSERT s přímou cestou materializovaného zobrazení uchovávané ve spojení s tabulkou
Zkrácení syntaxe tabulky v Oracle
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
-Kde
-Pokud není zadáno, je úložiště ve výchozím nastavení zrušeno. Pokud chcete ušetřit místo, můžete si úložiště ponechat a poté úložiště znovu použít
Pokud ořezáváte tabulku jiného schématu, použijte takto
Truncate table <owner>.<table name>
Příklady
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
Jak udělit tabulku zkrácení v oracle
V Oracle neexistuje žádné oprávnění ke zkrácení tabulky. Chcete-li udělit zkrácení tabulky v oracle, musíte poskytnout oprávnění Drop any table. Zahození jakékoli tabulky přináší mnoho dalších privilegií. Takže to nemusí být možné ve všech případech. Tento problém můžete překonat vytvořením procedury a povolením provedení této procedury. Pojďme to pochopit na příkladu
Předpokládejme, že chcete přidělit tabulku zkrácení jednoho uživatele USER1 jinému uživateli USER2
Pokud se pokusíte tabulku jednoduše zkrátit, narazíte na Error
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Nyní se pokusíme provést tuto věc prostřednictvím postupu a udělení oprávnění
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');
Pokud tuto věc nechcete dělat, budete muset udělit jakékoli oprávnění k vypuštění tabulky
conn system/<pass>
grant drop any table to user2;
Zkrátit kaskádu tabulky
- Před verzí Oracle 12c nemůžete zkrátit nadřazenou tabulku povoleného omezení cizího klíče. Pokud to vyzkoušíte, získáte ORA-02266 . Před zkrácením tabulky musíte omezení zakázat. Výjimkou je, že tabulku můžete zkrátit, pokud je omezení integrity samo-referenční.
- S Oracle 12c R1 zavedl Oracle Cascade clause for Truncate. Musíme zadat CASCADE, což vám umožní rekurzivně zkrátit tabulky v hierarchii. Pokud tuto klauzuli vynecháte a taková omezení referenční integrity existují, pak databáze vrátí chybu a tabulku nezkrátí. Pojďme pochopit tuto zkrácenou tabulku s kaskádou na příkladu
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.
Je důležité si uvědomit, že omezení cizího klíče by měla mít ON DELETE CASCADE, aby to fungovalo. Je důležité poznamenat, že zkrátit tabulku s kaskádou nejen odstraní data z tabulky DEPT, ale také odstraní tabulku EMP.
select * from DEPT; no rows Selected select * from EMP; no rows Selected
tabulka zkrácení Oracle vs odstranění
Zkrátit | Smazat |
Odstranit všechny řádky z tabulek | Lze jej použít k odstranění jednoho nebo více řádků z tabulky |
DDL příkazy a nespustí se při spouštění DELETE | Příkaz DML a spouštění ZAPNUTO Odstranění spouštěčů |
Resetuje značku Highwater v tabulce | To nemění značku nejvyšší hladiny v tabulce |
Nelze vrátit zpět | Lze vrátit zpět |
Rychlejší | pomalejší |
Nelze určit, kde je klauzule zde | Kde lze specifikovat klauzuli |
Máte možnost zachovat nebo zrušit úložiště přidělené segmentu | Tuto možnost nemá. Úložiště zůstává stejné |
Doufám, že tento příspěvek je užitečný pro zkrácenou tabulku v oracle
Související články
Oracle Vytvořit tabulku
zkontrolovat velikost tabulky v Oracle
oracle zobrazit všechny tabulky
Odstranit z tabulky v Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm