sql >> Databáze >  >> RDS >> Oracle

Jak zkrátit TABLE v Oracle

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 je název tabulky a vy musíte být vlastníkem tabulky nebo mít ke zkrácení tabulky zrušit všechna systémová oprávnění TABLE
-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


  1. JSON_UNQUOTE() – Odstranění nabídek z dokumentu JSON v MySQL

  2. Barman Cloud – Část 1:Archiv WAL

  3. Připojte aplikaci pro iPhone k PostgreSQL pomocí Libpq

  4. Vrátí GETUTCDATE() stejnou hodnotu, pokud se použije dvakrát ve stejném příkazu?