Truncate Table i Oracle är ett användbart kommando. Den används för att ta bort alla rader i tabellen och frigöra utrymmet som tilldelats tabellen. Här är några viktiga punkter angående Truncate-tabellen
- Vi kan använda trunkera tabell kommandot för att ta bort alla rader i tabellen och det frigör allt lagringsutrymme som tilldelats tabellen. Den återställer bordets högvattenmärke
- Det här kommandot kan inte återställas
- Du bör vara ägare till tabellen för att utföra operationen
- Att trunkera tabellen är ett DDL-kommando och det aktiverar inte borttagningsutlösare
- Vi kan också ta bort alla rader i tabellen med delete-kommando, men det frigör inte lagringsutrymmet som tilldelats tabellen
- När du trunkerar en tabell tar Oracle Database automatiskt bort all data i tabellens index och all materialiserad vy direkt-sökväg INSERT information som hålls i samband med tabellen
Trunkera tabellsyntax i Oracle
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
-Där
-Lagring tas bort som standard om inte ens specificerats. Om du vill spara utrymme kan du behålla lagring och sedan återanvända lagring
Om du trunkerar tabellen för ett annat schema, använd så här
Truncate table <owner>.<table name>
Exempel
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
Hur man beviljar trunkeringstabell i Oracle
Det finns ingen trunkerat tabellprivilegium i Oracle. Du måste ge släpp valfritt bordsprivilegium för att ge trunkerat bord i Oracle. Släpp vilket bord som helst kommer med många andra privilegier. Så detta kanske inte är möjligt i alla fall. Du kan övervinna denna utmaning genom att skapa en procedur och bevilja exekvering på den proceduren. Låt oss förstå med exemplet
Anta att du vill ge en trunkeringstabell för en användare USER1 till en annan användare USER2
Om du försöker trunkera tabellen helt enkelt, kommer du att trycka på felet
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Låt oss nu försöka göra det här genom proceduren och ge privilegier för 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');
Om du inte vill göra den här grejen måste du bevilja släppbehörighet för bord
conn system/<pass>
grant drop any table to user2;
Trunkera tabellkaskad
- Före Oracle 12c kan du inte trunkera den överordnade tabellen för en aktiverad främmande nyckelrestriktion. Om du provar det får du ORA-02266 . Du måste inaktivera begränsningen innan du trunkerar tabellen. Ett undantag är att du kan trunkera tabellen om integritetsbegränsningen är självrefererande.
- Med Oracle 12c R1 har Oracle introducerat Cascade-klausul för Truncate. Vi måste specificera CASCADE som tillåter dig att rekursivt trunkera ned tabellerna i en hierarki. Om du utelämnar den här satsen och sådana referensintegritetsbegränsningar finns, returnerar databasen ett fel och trunkerar inte tabellen. Låt oss förstå den här trunkerade tabellen med kaskad med ett exempel
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 är viktigt att notera att begränsningar för främmande nyckel bör ha en ON DELETE CASCADE för att detta ska fungera. Det är en viktig punkt att notera att trunkering av tabell med kaskad inte bara tar bort data från DEPT-tabellen utan det tar också bort EMP-tabellen.
select * from DEPT; no rows Selected select * from EMP; no rows Selected
oracle trunkate table kontra delete
Trunkera | Ta bort |
Ta bort alla rader från tabellerna | Den kan användas för att ta bort en eller flera rader från en tabell |
DDL-kommandon och startar inte på DELETE-utlösare | DML kommando och aktivera PÅ Ta bort triggers |
Den återställer Highwater-märket i tabellen | Det ändrar inte högvattenmärket i tabellen |
Kan inte återställas | Kan återställas |
Snabbare | långsammare |
Kan inte ange var satsen här | Där klausul kan specificeras |
Du har möjlighet att behålla eller ta bort lagringsutrymmet som tilldelats segmentet | Den har inte det här alternativet. Lagringen förblir densamma |
Hoppas det här inlägget är användbart för en trunkerad tabell i Oracle
Relaterade artiklar
Oracle Skapa tabell
kontrollera tabellstorleken i Oracle
oracle visa alla tabeller
Ta bort från en tabell i Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm