Trong SQL, nếu bạn muốn xóa một bảng khỏi cơ sở dữ liệu, bạn cần sử dụng DROP TABLE
tuyên bố.
Điều đó sẽ phá hủy bảng và tất cả dữ liệu của nó.
Cú pháp
Cú pháp chuẩn của SQL như sau:
DROP TABLE <table name> <drop behavior>
Ở đâu:
-
<table name>
là tên của bảng mà bạn muốn thả xuống. -
<drop behavior>
chỉ định bất kỳ tùy chọn nào. Đây có thể làCASCADE
hoặcRESTRICT
.
Một số RDBMS cũng chấp nhận IF EXISTS
tùy chọn có nghĩa là nó sẽ không trả về lỗi nếu bảng không tồn tại.
Một số RDBMS (chẳng hạn như MySQL và MariaDB) cũng chấp nhận TEMPORARY
tùy chọn từ khóa để đảm bảo chỉ các bảng tạm thời bị loại bỏ.
Oracle cũng chấp nhận PURGE
mệnh đề này sẽ xóa nó khỏi thùng rác.
Ví dụ
Đây là một ví dụ để chứng minh.
DROP TABLE t1;
Chạy mã đó sẽ làm rơi bảng có tên t1
và tất cả dữ liệu của nó.
IF EXISTS
Mệnh đề
Dưới đây là một ví dụ về việc sử dụng IF EXISTS
để kiểm tra xem bảng đã tồn tại chưa.
DROP TABLE IF EXISTS t1;
Sử dụng IF EXISTS
đảm bảo rằng chúng tôi không gặp lỗi nếu bảng không tồn tại.
Đây là những gì sẽ xảy ra nếu chúng tôi xóa IF EXISTS
từ tuyên bố:
DROP TABLE t1;
Kết quả:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Đó là thông báo do SQL Server trả về. Thông báo của bạn sẽ phụ thuộc vào DBMS mà bạn đang sử dụng.
Khoá &Chế độ xem Nước ngoài Phụ thuộc
Một số RDBMS cho phép một RESTRICT
tùy chọn hoặc CASCADE
từ khóa chỉ định điều gì sẽ xảy ra nếu bảng có bất kỳ khóa ngoài hoặc chế độ xem nào tham chiếu đến nó.
RESTRICT
Tùy chọn
Đây là một ví dụ về việc sử dụng RESTRICT
khi cố gắng bỏ một bảng được tham chiếu bởi khóa ngoại trong một bảng khác:
DROP TABLE t1 RESTRICT;
Kết quả:
cannot drop table t1 because other objects depend on it
Ví dụ này được thực hiện bằng PostgreSQL. RESTRICT
là tùy chọn mặc định, vì vậy chúng tôi sẽ nhận được cùng một kết quả ngay cả khi chúng tôi không bao gồm RESTRICT
từ khóa.
CASCADE
Tùy chọn
Đây là những gì sẽ xảy ra nếu chúng tôi chuyển sang CASCADE
khi cố gắng thả cùng một bảng (được tham chiếu bởi khóa ngoại trong bảng khác):
DROP TABLE t1 CASCADE;
Kết quả:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Điều này đã làm mất khóa ngoại đang tham chiếu đến t1
của chúng tôi bàn. Khóa ngoại được gọi là t2_c2_fkey
.
Lưu ý rằng nó không làm rơi bảng có khóa ngoại. Nó chỉ làm rơi khóa ngoại.
Nếu bảng đích (t1
) được tham chiếu bởi bất kỳ chế độ xem nào, toàn bộ chế độ xem sẽ bị loại bỏ.
Bạn không cần chỉ định CASCADE
để loại bỏ bất kỳ chỉ mục, quy tắc, trình kích hoạt hoặc ràng buộc nào tồn tại cho bảng mục tiêu. Chúng tự động bị loại bỏ, ngay cả khi sử dụng tùy chọn mặc định (RESTRICT
).
MySQL và MariaDB
Một số DBMS (chẳng hạn như MySQL và MariaDB) chấp nhận RESTRICT
và CASCADE
từ khóa, nhưng chúng không làm gì cả. Chúng được cung cấp đơn giản để dễ dàng di chuyển hơn giữa các DBMS.
Oracle
Oracle có một cú pháp hơi khác, CASCADE CONSTRAINTS
, loại bỏ tất cả các ràng buộc toàn vẹn tham chiếu tham chiếu đến các khóa chính và duy nhất trong bảng đã loại bỏ.
Máy chủ SQL
Máy chủ SQL không hỗ trợ CASCADE
hoặc RESTRICT
từ khóa. Nếu bảng có bất kỳ phụ thuộc khóa ngoại nào, bạn cần phải loại bỏ chúng trước khi bỏ bảng, nếu không, bạn sẽ gặp lỗi.
Tuy nhiên, trong SQL Server, bạn có thể bỏ một bảng ngay cả khi nó được tham chiếu bởi một dạng xem hoặc thủ tục được lưu trữ. Do đó, bạn nên kiểm tra bất kỳ tham chiếu nào như vậy và loại bỏ chúng một cách rõ ràng bằng cách sử dụng DROP VIEW
hoặc DROP PROCEDURE
.
SQLite
SQLite không hỗ trợ CASCADE
hoặc RESTRICT
từ khóa.
Nếu bảng mục tiêu được tham chiếu bởi bất kỳ chế độ xem nào, bảng sẽ vẫn bị loại bỏ (và chế độ xem sẽ vẫn còn).
Nếu bảng đích được tham chiếu bởi bất kỳ khóa ngoại nào, kết quả sẽ phụ thuộc vào việc bạn đã bật khóa ngoại chưa và nếu có, liệu có bất kỳ dữ liệu nào trong bảng con không và nếu có, khóa ngoại có được xác định bằng ON DELETE CASCADE
.
Nếu bạn sử dụng SQLite, hãy xem SQLite DROP TABLE
cho một ví dụ và thảo luận về việc loại bỏ một bảng được tham chiếu bởi khóa ngoại.
Thả nhiều bảng
Một số RDBMS cho phép bạn bỏ nhiều bảng từ một DROP TABLE
tuyên bố.
Ví dụ:
DROP TABLE t11, t12;
Các RDBMS hỗ trợ cú pháp này bao gồm SQL Server, MySQL, MariaDB và PostgreSQL.
Tuy nhiên, nếu bạn đang xóa một bảng được tham chiếu bởi khóa ngoại và khóa ngoại đó ngăn không cho nó bị bỏ, bạn sẽ cần liệt kê bảng con trước bảng mẹ.
Ví dụ:nếu tôi chạy câu lệnh trên trong SQL Server, tôi gặp lỗi sau:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
Trong trường hợp này, tôi có thể chỉ cần chuyển đổi thứ tự của các bảng trong DROP TABLE
của mình tuyên bố:
DROP TABLE t12, t11;
Trên thực tế, trong trường hợp này, tôi gặp một lỗi khác cho tôi biết rằng t12
không tồn tại.
Đây là những gì tôi nhận được:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Điều này là do, mặc dù câu lệnh trước đó không thể thả t11
, trên thực tế, nó đã thành công trong việc loại bỏ t12
.
Và cũng giống như một vở hài kịch của lỗi, lần này nó có thể làm rớt t11
nhưng không phải t12
.
Bất chấp điều đó, cả hai bảng hiện đã bị loại bỏ.
Nhưng nếu bạn nhận được đơn đặt hàng chính xác trong lần đầu tiên, bạn sẽ nhận được một thông báo như sau:
Commands completed successfully.
Từ khóa TẠM THỜI
Một số RDBMS (chẳng hạn như MySQL và MariaDB) chấp nhận TEMPORARY
từ khóa.
Nó nằm giữa DROP
và TABLE
, như thế này:
DROP TEMPORARY TABLE t1;
Sử dụng TEMPORARY
từ khóa sẽ đảm bảo rằng bạn không vô tình làm rơi một bảng không tạm thời khi cố gắng bỏ một bảng tạm thời.
TEMPORARY
từ khóa có các tác dụng sau:
- Câu lệnh chỉ giảm
TEMPORARY
bảng. - Câu lệnh không gây ra một cam kết ngầm (sử dụng
DROP TABLE
không cóTEMPORARY
từ khóa tự động cam kết giao dịch đang hoạt động hiện tại). - Không có quyền truy cập nào được kiểm tra. A
TEMPORARY
bảng chỉ hiển thị với phiên đã tạo nó, vì vậy không cần kiểm tra.
Điều khoản thanh lọc
Oracle có PURGE
tùy chọn , bạn có thể sử dụng mệnh đề này nếu muốn bỏ bảng và giải phóng không gian liên kết với nó trong một bước duy nhất. Nếu bạn chỉ định PURGE
, thì cơ sở dữ liệu không đặt bảng và các đối tượng phụ thuộc của nó vào thùng rác.
Điều này tương đương với việc đầu tiên bạn thả bảng và sau đó xóa nó khỏi thùng rác, nhưng nó cho phép bạn tiết kiệm một bước trong quy trình.
Lưu ý rằng nếu bạn chỉ định PURGE
, bạn sẽ không thể khôi phục bảng.
Nếu bạn không chỉ định PURGE
, DROP
TABLE
câu lệnh không dẫn đến việc không gian được giải phóng trở lại vùng bảng để các đối tượng khác sử dụng và không gian tiếp tục được tính vào hạn ngạch dung lượng của người dùng.