sql >> Databasteknik >  >> RDS >> Oracle

Hur man trunkerar TABLE i Oracle

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 är namnet på tabellen och du måste vara ägare till tabellen eller ha släpp några TABLE-systemprivilegier för att trunkera en tabell
-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


  1. Konvertera PostgreSQL-array till PHP-array

  2. PL/pgSQL-funktioner:Hur man returnerar en normal tabell med flera kolumner med hjälp av en execute-sats

  3. MySQL-inlärningsväg

  4. Hur kan jag upptäcka och binda ändringar mellan radvärden i en SQL-tabell?