Truncate Table i Oracle er en nyttig kommando. Den bruges til at slette alle rækker i tabellen og frigive den plads, der er allokeret til tabellen. Her er nogle vigtige punkter vedrørende Truncate-tabellen
er navnet på tabellen, og du skal være ejer af tabellen eller have Drop eventuelle TABLE-systemprivilegier for at afkorte en tabel
-Lager er som standard slettet, hvis det endda ikke er angivet. Hvis du vil bevare plads, kan du beholde lagerplads og derefter genbruge lagerplads
Hvis du trunkerer tabellen for et andet skema, skal du bruge sådan her
Truncate table <owner>.<table name>
Eksempler
Truncate table EMP;
Truncate table SCOTT.EMP;
Truncate table SCOTT.EMP reuse storage;
Sådan tildeles trunkeringstabel i Oracle
Der er ingen privilegium til at afkorte tabel i Oracle. Du er nødt til at give Drop ethvert bord-privilegium for at give afkorte bord i Oracle. Drop ethvert bord kommer med mange andre privilegier. Så det er muligvis ikke muligt i alle tilfælde. Du kan overvinde denne udfordring ved at oprette en procedure og give execute på den procedure. Lad os forstå med eksemplet
Antag, at du vil give en afkortningstabel for én bruger USER1 til en anden bruger USER2
Hvis du forsøger at afkorte tabellen simpelthen, så vil du trykke på fejlen
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Lad os nu prøve at gøre denne ting gennem proceduren og give privilegier på det
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');
Hvis du ikke ønsker at gøre dette, bliver du nødt til at give drop ethvert bordprivilegium
conn system/<pass>
grant drop any table to user2;
Trunker tabelkaskade
- Før Oracle 12c kan du ikke afkorte den overordnede tabel for en aktiveret fremmednøglebegrænsning. Hvis du prøver det, får du ORA-02266 . Du skal deaktivere begrænsningen, før du trunkerer tabellen. En undtagelse er, at du kan afkorte tabellen, hvis integritetsbegrænsningen er selvrefererende.
- Med Oracle 12c R1 har Oracle introduceret Cascade-klausul for Truncate. Vi er nødt til at specificere CASCADE, så du rekursivt kan trunkere tabellerne i et hierarki. Hvis du udelader denne klausul, og der findes sådanne referenceintegritetsbegrænsninger, returnerer databasen en fejl og trunkerer ikke tabellen. Lad os forstå denne afkortede tabel med kaskade med et eksempel
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.
Det er vigtigt at bemærke, at fremmednøgle-begrænsninger skal have en ON SLET CASCADE for at dette virker. Det er et vigtigt punkt at bemærke, at afkortning af tabel med kaskade ikke kun sletter data fra DEPT-tabellen, men den sletter også EMP-tabellen.
select * from DEPT;
no rows Selected
select * from EMP;
no rows Selected
oracle truncate table vs delete
Truncate | Slet |
Slet alle rækkerne fra tabellerne | Den kan bruges til at slette en eller flere rækker fra en tabel |
DDL-kommandoer og udløses ikke på DELETE-udløsere | DML-kommando og affyr TIL Slet triggere |
Den nulstiller Highwater-mærket i tabellen | Det ændrer ikke på højvandsmærket i tabellen |
Kan ikke rulles tilbage | Kan rulles tilbage |
Hurtigere | langsommere |
Kan ikke angive, hvor klausulen er her | Hvor klausul kan specificeres |
Du har mulighed for at beholde eller droppe den lagerplads, der er allokeret til segmentet | Den har ikke denne mulighed. Opbevaring forbliver den samme |
Håber dette indlæg er nyttigt for en afkortet tabel i oracle
Relaterede artikler
Oracle Opret tabel
tjek tabelstørrelse i Oracle
oracle vis alle tabeller
Slet fra en tabel i Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm