Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách cắt ngắn TABLE trong Oracle

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 đó là tên của bảng và bạn phải là chủ sở hữu của bảng hoặc có quyền Bỏ bất kỳ quyền nào của hệ thống TABLE để cắt bớt một bảng
-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

ở đâu
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 Mệ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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. vấn đề trong việc tìm kiếm danh sách các tệp trong thư mục

  2. Quá trình nâng cấp từng bước lên R12.2 Nâng cấp phần -2 (Trình điều khiển Nâng cấp Chính cho R12.2.0)

  3. Oracle chuyển đổi giây thành giờ:Phút:Giây

  4. Cách lấy số hàng bị ảnh hưởng bởi một câu lệnh khi bên trong trình kích hoạt của câu lệnh đó

  5. ORA-12154 không thể phân giải mã nhận dạng kết nối được chỉ định