Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да съкратите TABLE в Oracle

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.security.AccessControlException:достъпът е отказан (java.security.SecurityPermission authProvider.SunMSCAPI)

  2. Имената на Oracle TNS не се показват при добавяне на нова връзка към SQL Developer

  3. Функция за списък на ORACLE SQL

  4. Предайте списък с цели числа от C# в съхранената процедура на Oracle

  5. Сравняване на дати в Oracle SQL