Truncate Table в Oracle е полезна команда. Използва се за изтриване на всички редове в таблицата плюс освобождаване на пространството, разпределено на таблицата. Ето някои важни точки относно таблицата Truncate
- Можем да използваме отрязване на таблица команда за изтриване на всички редове в таблицата и освобождава цялото пространство за съхранение, разпределено на таблицата. Той нулира знака за висока вода на масата
- Тази команда не може да бъде връщана назад
- Трябва да сте собственик на таблицата, за да изпълните операцията
- Отрязването на таблицата е DDL команда и не задейства тригерите при изтриване.
- Можем да изтрием всички редове в таблицата и чрез команда delete, но това не освобождава пространството за съхранение, разпределено на таблицата
- Когато съкратите таблица, Oracle Database автоматично премахва всички данни в индексите на таблицата и всяка материализирана информация за директен път INSERT на изглед, съхранявана във връзка с таблицата
Съкращаване на синтаксиса на таблицата в Oracle
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
-Където <име на таблица> е името на таблицата и вие трябва да сте собственик на таблицата или да имате отхвърляне на системните привилегии TABLE, за да съкратите таблица
-Съхранението се отпада по подразбиране, ако дори не е посочено. Ако искате да запазите място, можете да запазите място за съхранение и след това да го използвате повторно
Ако съкращавате таблицата на друга схема, използвайте така
Truncate table <owner>.<table name>
Примери
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
Как да предоставим съкратена таблица в oracle
В Oracle няма привилегия за съкращаване на таблица. Трябва да предоставите привилегия за премахване на всяка таблица, за да предоставите съкратена таблица в oracle. Пуснете всяка маса идва с много други привилегии. Така че това може да не е възможно във всички случаи. Можете да преодолеете това предизвикателство, като създадете процедура и разрешите изпълнението на тази процедура. Нека разберем с примера
Да предположим, че искате да дадете съкратена таблица на един потребител USER1 на друг потребител USER2
Ако се опитате просто да съкратите таблицата, ще ударите Грешка
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Сега нека се опитаме да направим това чрез процедурата и да предоставим привилегия върху нея
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');
Ако не искате да правите това, тогава ще трябва да предоставите привилегия за премахване на таблица
conn system/<pass>
grant drop any table to user2;
Каскада за съкращаване на таблици
- Преди Oracle 12c не можете да съкратите родителската таблица на активирано ограничение за външен ключ. Ако го опитате, ще получите ORA-02266 . Трябва да деактивирате ограничението, преди да съкратите таблицата. Изключение е, че можете да съкратите таблицата, ако ограничението за интегритет е самореферентно.
- С Oracle 12c R1 Oracle въведе Cascade клауза за Truncate. Трябва да зададем CASCADE, което ви позволява рекурсивно да съкращавате таблиците в йерархия. Ако пропуснете тази клауза и съществуват такива ограничения за референтна цялост, тогава базата данни връща грешка и не съкращава таблицата. Нека разберем тази съкратена таблица с каскада с пример
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.
Важно е да се отбележи, че ограниченията на външния ключ трябва да имат КАСКАДА ЗА ИЗТРИВАНЕ, за да работи това. Важно е да се отбележи, че съкратената таблица с каскада не само изтрива данни само от таблицата DEPT, но също така изтрива таблицата EMP.
select * from DEPT; no rows Selected select * from EMP; no rows Selected
Отрязване на таблицата на oracle срещу изтриване
Отрязване | Изтриване |
Изтрийте всички редове от таблиците | Може да се използва за изтриване на един или повече редове от таблица |
DDL команди и не се задейства при тригери DELETE | DML команда и активиране на тригери за изтриване |
Нулира знака Highwater в таблицата | Не променя знака за висока вода в таблицата |
Не може да бъде връщане назад | Може да бъде връщане назад |
По-бързо | по-бавно |
Тук не може да се посочи къде е клаузата | Къде може да се посочи клауза |
Имате възможност да запазите или изхвърлите паметта, разпределена на сегмента | Тя няма тази опция. Съхранението остава същото |
Надявам се, че тази публикация е полезна за таблица за съкращаване в oracle
Сродни статии
Oracle Създаване на таблица
проверете размера на таблицата в Oracle
oracle покажи всички таблици
Изтрийте от таблица в Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm