Truncate Table trong Oracle là một lệnh hữu ích. Nó được sử dụng để xóa tất cả các hàng trong bảng đồng thời giải phóng không gian được phân bổ cho bảng. Dưới đây là một số điểm quan trọng liên quan đến bảng Cắt ngắn
- Chúng tôi có thể sử dụng bảng cắt ngắn lệnh xóa tất cả các hàng trong bảng và nó giải phóng tất cả không gian lưu trữ được phân bổ cho bảng. Nó đặt lại vạch mực nước cao của bảng
- Không thể khôi phục lệnh này
- Bạn phải là chủ sở hữu của bảng để thực hiện thao tác
- Cắt ngắn bảng là một lệnh DDL và nó không kích hoạt trình kích hoạt xóa
- Chúng tôi cũng có thể xóa tất cả các hàng trong bảng bằng lệnh xóa nhưng nó không giải phóng không gian lưu trữ được phân bổ cho bảng
- Khi bạn cắt bớt một bảng, Cơ sở dữ liệu Oracle sẽ tự động xóa tất cả dữ liệu trong chỉ mục của bảng và mọi thông tin INSERT đường dẫn trực tiếp dạng xem được vật liệu hóa được giữ liên quan đến bảng
Cú pháp cắt ngắn bảng trong Oracle
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
-Trong đó
-Bộ lưu trữ bị loại bỏ theo mặc định nếu thậm chí không được chỉ định. Nếu muốn tiết kiệm dung lượng, bạn có thể giữ lại dung lượng, sau đó sử dụng lại dung lượng
Nếu bạn đang cắt bớt bảng của một lược đồ khác, hãy sử dụng như thế này
Truncate table <owner>.<table name>
Ví dụ
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
Cách cấp bảng cắt ngắn trong oracle
Không có đặc quyền bảng cắt ngắn trong Oracle. Bạn cần cung cấp đặc quyền Drop bất kỳ bảng nào để cấp bảng cắt ngắn trong oracle. Bỏ bàn nào đi kèm với nhiều đặc quyền khác. Vì vậy, điều này có thể không thực hiện được trong mọi trường hợp. Bạn có thể vượt qua thử thách này bằng cách tạo một thủ tục và cấp quyền thực thi trên thủ tục đó. Hãy cùng hiểu với ví dụ
Giả sử bạn muốn cung cấp một bảng cắt ngắn của một người dùng USER1 cho một người dùng khác USER2
Nếu bạn cố gắng cắt ngắn bảng một cách đơn giản, thì bạn sẽ gặp phải Lỗi
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Bây giờ chúng ta hãy cố gắng thực hiện điều này thông qua thủ tục và cấp đặc quyền cho 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');
Nếu bạn không muốn làm điều này, thì bạn sẽ cần cấp bất kỳ đặc quyền nào trên bảng
conn system/<pass>
grant drop any table to user2;
Xếp tầng bảng cắt ngắn
- Trước Oracle 12c, Bạn không thể cắt bớt bảng mẹ của một ràng buộc khóa ngoại đã kích hoạt. Nếu bạn dùng thử, bạn sẽ nhận được ORA-02266 . Bạn phải tắt ràng buộc trước khi cắt bớt bảng. Một ngoại lệ là bạn có thể cắt bớt bảng nếu ràng buộc toàn vẹn là tự tham chiếu.
- Với Oracle 12c R1, Oracle đã giới thiệu điều khoản Cascade cho Truncate. Chúng tôi phải Chỉ định CASCADE cho phép bạn cắt ngắn một cách đệ quy các bảng trong một hệ thống phân cấp Nếu bạn bỏ qua mệnh đề này và tồn tại các ràng buộc toàn vẹn tham chiếu như vậy, thì cơ sở dữ liệu trả về lỗi và không cắt ngắn bảng. Hãy hiểu bảng rút gọn này bằng cách phân tầng với một ví dụ
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.
Điều quan trọng cần lưu ý là các ràng buộc khóa ngoại phải có CASCADE BẬT XÓA để điều này hoạt động. Một điểm quan trọng cần lưu ý là cắt ngắn bảng với tầng không chỉ xóa dữ liệu khỏi bảng DEPT mà còn xóa cả bảng EMP.
select * from DEPT; no rows Selected select * from EMP; no rows Selected
bảng cắt ngắn oracle so với xóa
Cắt ngắn | Xóa |
Xóa tất cả các hàng khỏi bảng | Nó có thể được sử dụng để xóa một hoặc nhiều hàng khỏi bảng |
Lệnh DDL và không kích hoạt Khi kích hoạt DELETE | Lệnh DML và kích hoạt ON Xóa trình kích hoạt |
Nó đặt lại dấu Highwater trong bảng | Nó không làm thay đổi mốc nước cao trong bảng |
Không thể khôi phục | Có thể khôi phục lại |
Nhanh hơn | chậm hơn |
Không thể chỉ định mệnh đề ở đây | ở đâuMệnh đề có thể được chỉ định ở đâu |
Bạn có tùy chọn giữ hoặc bỏ bộ nhớ được phân bổ cho phân đoạn | Nó không có tùy chọn này. Bộ nhớ vẫn như cũ |
Hy vọng Bài đăng này hữu ích cho bảng cắt ngắn trong oracle
Các bài viết có liên quan
Oracle Tạo bảng
kiểm tra kích thước bảng trong Oracle
oracle hiển thị tất cả các bảng
Xóa khỏi một bảng trong Oracle
https://docs.oracle.com/cd/B28359_01/server. 111 / b28286 / statement_10007.htm