Oracle में Truncate Table एक उपयोगी कमांड है। इसका उपयोग तालिका में सभी पंक्तियों को हटाने और तालिका को आवंटित स्थान को छोड़ने के लिए किया जाता है। यहाँ ट्रंकेट टेबल के बारे में कुछ महत्वपूर्ण बिंदु दिए गए हैं
- हम टेबल को छोटा करें का उपयोग कर सकते हैं तालिका में सभी पंक्तियों को हटाने का आदेश देता है और यह तालिका को आवंटित सभी संग्रहण स्थान को छोड़ देता है। यह तालिका के उच्च जल चिह्न को रीसेट करता है
- यह आदेश रोलबैक नहीं हो सकता
- ऑपरेशन निष्पादित करने के लिए आपको तालिका का स्वामी होना चाहिए
- टेबल को छोटा करना एक डीडीएल कमांड है और यह डिलीट ट्रिगर्स को सक्रिय नहीं करता है
- हम डिलीट कमांड द्वारा भी टेबल की सभी पंक्तियों को हटा सकते हैं लेकिन यह टेबल को आवंटित स्टोरेज स्पेस को रिलीज नहीं करता है
- जब आप किसी तालिका को छोटा करते हैं, तो Oracle डेटाबेस स्वचालित रूप से तालिका के अनुक्रमणिका में सभी डेटा को हटा देता है और तालिका के साथ जुड़े किसी भी भौतिक दृश्य प्रत्यक्ष-पथ INSERT जानकारी को हटा देता है
Oracle में तालिका सिंटैक्स को छोटा करें
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
-जहां <तालिका नाम> तालिका का नाम है और आपको तालिका का स्वामी होना चाहिए या किसी तालिका को छोटा करने के लिए किसी भी तालिका सिस्टम विशेषाधिकार को छोड़ना होगा
-यदि निर्दिष्ट नहीं है तो भी भंडारण डिफ़ॉल्ट रूप से गिरा दिया जाता है। अगर आप जगह बचाना चाहते हैं, तो आप स्टोरेज रख सकते हैं, फिर स्टोरेज का दोबारा इस्तेमाल कर सकते हैं
यदि आप किसी अन्य स्कीमा की तालिका को छोटा कर रहे हैं, तो इस तरह उपयोग करें
Truncate table <owner>.<table name>
उदाहरण
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
ऑरैकल में ट्रंकेट टेबल कैसे दें
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 ने Truncate के लिए Cascade क्लॉज पेश किया है। हमें 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.
यह नोट करना महत्वपूर्ण है कि विदेशी कुंजी बाधाओं को काम करने के लिए एक ऑन डिलीट कैस्केड होना चाहिए। यह एक महत्वपूर्ण बिंदु है कि कैस्केड के साथ ट्रंकेट तालिका न केवल डीईपीटी तालिका से डेटा हटाती है बल्कि यह ईएमपी तालिका को भी हटा देती है।
select * from DEPT; no rows Selected select * from EMP; no rows Selected
ओरेकल ट्रंकेट टेबल बनाम डिलीट
छोटा करें | हटाएं |
तालिकाओं से सभी पंक्तियां हटाएं | इसका उपयोग किसी तालिका से एक या अधिक पंक्तियों को हटाने के लिए किया जा सकता है |
DDL कमांड करता है और DELETE ट्रिगर पर सक्रिय नहीं होता है | DML कमांड और ट्रिगर हटाएं पर सक्रिय करें |
यह टेबल में हाईवाटर मार्क को रीसेट करता है | यह तालिका में उच्च जल चिह्न को नहीं बदलता है |
रोलबैक नहीं किया जा सकता | रोलबैक किया जा सकता है |
तेज़ | धीमी |
यह निर्दिष्ट नहीं कर सकता कि यहां खंड कहां है | जहां खंड निर्दिष्ट किया जा सकता है |
आपके पास खंड के लिए आवंटित संग्रहण को रखने या छोड़ने का विकल्प है | इसमें यह विकल्प नहीं है। संग्रहण वही रहता है |
आशा है कि यह पोस्ट ऑरैकल में एक ट्रंकेट टेबल के लिए उपयोगी है
संबंधित लेख
Oracle तालिका बनाएं
Oracle में तालिका का आकार जांचें
ऑरेकल सभी तालिकाओं को दिखाएं
Oracle में किसी तालिका से हटाएं
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm