sql >> Database teknologi >  >> RDS >> Oracle

Sådan afkortes TABLE i Oracle

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

  • Vi kan bruge truncate table kommandoen for at slette alle rækkerne i tabellen, og den frigiver al den lagerplads, der er allokeret til tabellen. Den nulstiller bordets højvandsmærke
  • Denne kommando kan ikke rulles tilbage
  • Du bør være ejer af tabellen for at udføre handlingen
  • Trunkering af tabellen er en DDL-kommando, og den udløser ikke slettetriggerne
  • Vi kan også slette alle rækkerne i tabellen ved at slette kommandoen, men det frigiver ikke den lagerplads, der er allokeret til tabellen
  • Når du trunkerer en tabel, fjerner Oracle Database automatisk alle data i tabellens indekser og enhver materialiseret visning direkte-sti INSERT information, der opbevares i forbindelse med tabellen

Afkort tabelsyntaks i Oracle

Truncate table <table name>
[CASCADE]
[[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]]
[[ DROP | REUSE]] STORAGE ];

-Hvor

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


  1. 2019 Open Source-databaserapport:Topdatabaser, Public Cloud vs. On-Premise, Polyglot Persistence

  2. Postgres Kopier fra Variable med CSV-data

  3. Dato/tidsstempel for at registrere, hvornår en post blev tilføjet til tabellen?

  4. Opdater flere kolonner i en triggerfunktion i plpgsql