CodeGym /Các khóa học /SQL SELF /Xóa bảng với DROP TABLE

Xóa bảng với DROP TABLE

SQL SELF
Mức độ , Bài học
Có sẵn

Giờ thì nói về cách xóa bảng trong database cho chuẩn bằng lệnh DROP TABLE nhé.

DROP TABLE — là lệnh cho phép bạn xóa một bảng khỏi database cùng với toàn bộ dữ liệu và cấu trúc của nó. Hãy tưởng tượng bạn vừa code xong đồ án tốt nghiệp, rồi lỡ tay đốt luôn cả laptop. Đó chính là cảm giác khi dùng DROP TABLE. Nghe hơi ghê nhỉ? Đừng lo, quan trọng là hiểu nó hoạt động thế nào và cẩn thận khi dùng thôi!

Đặc điểm của DROP TABLE:

  • Xóa toàn bộ bảng (và dữ liệu trong đó) không thể khôi phục (trừ khi bạn đã backup trước đó).
  • Giải phóng hoàn toàn dung lượng mà bảng chiếm trên ổ đĩa.
  • Xóa luôn tất cả các index, constraint và trigger liên quan.

Cú pháp lệnh DROP TABLE

Lệnh DROP TABLE có cú pháp siêu đơn giản:

DROP TABLE bảng;

Trong đó:

  • bảng — tên bảng bạn muốn xóa.

Ví dụ đơn giản về xóa bảng

Xem ví dụ nhé. Giả sử có bảng students:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age > 0)
);

Nếu bảng này không cần nữa, bạn có thể xóa bằng lệnh:

DROP TABLE students;

Sau khi chạy lệnh này, bảng students sẽ biến mất hoàn toàn khỏi database, bao gồm mọi dữ liệu sinh viên (nếu có).

Xóa nhiều bảng cùng lúc

Bạn cũng có thể xóa nhiều bảng chỉ với một câu lệnh. Chỉ cần liệt kê tên bảng, cách nhau bằng dấu phẩy:

DROP TABLE table1, table2, table3;

Ví dụ:

DROP TABLE students, teachers, courses;

Lệnh này sẽ xóa luôn ba bảng: students, teacherscourses.

Dùng IF EXISTS

Lệnh DROP TABLE sẽ báo lỗi nếu bạn cố xóa bảng không tồn tại. Để tránh lỗi này, hãy dùng tuỳ chọn IF EXISTS:

DROP TABLE IF EXISTS table_name;

Ví dụ:

DROP TABLE IF EXISTS students;

Nếu bảng students tồn tại, nó sẽ bị xóa. Nếu không có bảng này, lệnh vẫn chạy mà không báo lỗi, chỉ cảnh báo thôi.

Xóa bảng có phụ thuộc

Đôi khi việc xóa bảng sẽ gặp khó nếu có bảng hoặc object khác phụ thuộc vào nó. Ví dụ, nếu bảng có foreign key liên kết với bảng khác. Về foreign key mình sẽ nói kỹ ở level sau :P

Giả sử bạn có hai bảng: studentsenrollments. Bảng enrollments phụ thuộc vào students vì nó tham chiếu bằng foreign key.

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE enrollments (
    id SERIAL PRIMARY KEY,
    student_id INTEGER REFERENCES students(id), -- cột student_id tham chiếu students.id
    course_name VARCHAR(100)
);

Nếu bạn thử xóa bảng students mà chưa xóa enrollments, sẽ gặp lỗi:

DROP TABLE students;
-- ERROR:  không thể xóa bảng "students" vì có object khác phụ thuộc vào nó
-- DETAIL:  constraint enrollments_student_id_fkey trên bảng enrollments phụ thuộc vào bảng students

Để xóa bảng cùng mọi object phụ thuộc, dùng tuỳ chọn CASCADE:

DROP TABLE students CASCADE;

Lệnh này sẽ xóa bảng students và tự động xóa mọi object phụ thuộc (ở đây là bảng enrollments).

Nhưng cẩn thận với CASCADE nhé, vì nó có thể xóa nhiều thứ hơn bạn nghĩ. Muốn biết object nào sẽ bị xóa, dùng CASCADE rồi kiểm tra log :)

Xóa bảng mà không xóa object phụ thuộc

Nếu bạn muốn tránh xóa nhầm các object liên quan, hãy dùng tuỳ chọn RESTRICT. Tuỳ chọn này sẽ không cho xóa bảng nếu có object khác phụ thuộc:

DROP TABLE students RESTRICT;

Nếu bảng có object phụ thuộc, lệnh sẽ báo lỗi và không xóa gì cả.

Bảng tạm thời và cách xóa

Bảng tạm thời (tạo bằng CREATE TEMP TABLE) sẽ tự động bị xóa khi session database kết thúc. Tuy nhiên, bạn vẫn có thể xóa bảng tạm trong session bằng DROP TABLE.

Ví dụ:

CREATE TEMP TABLE temp_data (
    id SERIAL PRIMARY KEY,
    value TEXT
);

DROP TABLE temp_data;

Lỗi phổ biến khi dùng DROP TABLE

Cố xóa bảng không tồn tại. Để tránh lỗi này, hãy dùng IF EXISTS.

DROP TABLE IF EXISTS non_existing_table;

Xóa bảng có phụ thuộc mà không dùng CASCADE. Nếu có bảng khác liên kết với bảng bạn muốn xóa, lệnh sẽ báo lỗi. Dùng CASCADE nếu bạn chắc chắn muốn xóa hết mọi phụ thuộc.

DROP TABLE students CASCADE;

Lạm dụng CASCADE. Có thể dẫn đến xóa nhầm object quan trọng. Trước khi dùng CASCADE, hãy chắc chắn bạn biết object nào sẽ bị ảnh hưởng.

Xóa nhầm bảng. Luôn kiểm tra kỹ trước khi xóa, nhất là trên database production.

Mẹo hay, có lúc hơi nghiêm túc

Mẹo 1: cứ phủ nhận đi

Xóa dấu vết nhanh hơn xóa dữ liệu.
Sau đó tự tin nói: “Đó là bug trong log thôi. Mình fix rồi!”

Giả vờ đó là tính năng.
“Bọn mình vừa stress-test khả năng chịu lỗi… Và, ừm, hệ thống không chịu nổi. Nhưng giờ biết cần cải thiện gì rồi!”

Báo động: “Có sự cố cấp độ production!”
Khi mọi người chạy loạn lên thì chẳng ai kịp hỏi ai vừa bấm DELETE FROM mà không có WHERE.

Update CV trên hh.ru với vai trò DBA.
Giờ bạn thật sự gần gũi với database hơn rồi. Nhất là mấy cái database không còn tồn tại nữa.

Chuẩn bị sẵn coffee break.
Vì vài phút nữa có thể bạn sẽ được “nghỉ dự án… mãi mãi”.

Giả vờ đây là staging.
“Bạn chắc đây không phải môi trường test chứ? Hình như mình đang test gì đó… chắc vậy…”

Ngồi giữa open space.
Không ai tin thủ phạm lại dám ngồi lộ liễu thế đâu.

Đổ lỗi cho ChatGPT.
Tất cả là do AI. Nhìn đấy, nó vẫn chưa thay thế được bạn đâu. Đừng sa thải mình nhé.

Mẹo 2: tìm việc khi đã “dính phốt”

  • Xóa hết bảng một lần. Sếp sẽ bận rộn đến mức không kịp đuổi ai riêng lẻ đâu.

  • Không ai chịu trận một mình. Nếu kéo được cả sếp theo thì chẳng ai dám cho bạn review xấu nữa.

  • Xóa luôn dữ liệu khách hàng? Chúc mừng, giờ công ty có vấn đề to hơn chuyện sa thải bạn rồi.

Mẹo 3: backup trước khi xóa

Giờ thì nghiêm túc nè.

Trước khi xóa bảng (nhất là bảng chứa dữ liệu quan trọng), hãy backup bằng lệnh pg_dump. Như vậy nếu lỡ tay xóa nhầm, bạn vẫn có thể phục hồi lại dữ liệu.

Ví dụ lệnh backup:

pg_dump -U username -d database_name -t table_name > table_backup.sql

Đến đây là bạn đã nắm hết cơ bản về lệnh DROP TABLE rồi. Hãy giữ “nút hạt nhân” này bên mình và chỉ dùng khi thật sự chắc chắn nhé. Bài sau tụi mình sẽ tiếp tục học về thay đổi cấu trúc bảng và các object khác trong database.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION