Hành trình của chúng tôi đến MySQL bắt đầu với TẠO BẢNG, sau đó là CHÈN. Hôm nay, chúng ta đang tiếp tục với câu lệnh MySQL DELETE. Nó gần như phổ biến như câu lệnh MySQL UPDATE.
Vì bạn đã quen với T-SQL DELETE, nên mục tiêu là giúp bạn làm việc hiệu quả hơn bằng cách sử dụng cú pháp MySQL. Có những khác biệt nhỏ trong các câu lệnh DELETE này, nhưng không có gì mà bạn không thể xử lý. Hãy bắt đầu.
Chuẩn bị Dữ liệu Mẫu
Một trong những nhu cầu phổ biến nhất là tác vụ xóa hàng MySQL. Chúng tôi sẽ kiểm tra nó ở đây, nhưng trước tiên, chúng tôi phải chuẩn bị khu vực làm việc của mình. Để xóa bất kỳ bản ghi nào, trước tiên chúng ta cần có chúng. Do đó, hãy xây dựng cơ sở dữ liệu trong MySQL.
Tôi cảm thấy hoài niệm về loạt phim truyền hình từ những năm 80, vì vậy tôi sẽ sử dụng các tập của MacGyver và Quantum Leap để làm dữ liệu mẫu. Tôi có tệp Excel cuối cùng để nhập dữ liệu vào cơ sở dữ liệu mới. Tệp này có 2 trang tính có tên là Tiêu đề và Tập . Chúng tôi sẽ nhập cả hai vào hai bảng.
Trước khi nhập dữ liệu, chúng ta nên tạo cơ sở dữ liệu có tên là tv-series với hai bảng được gọi là Tiêu đề và Tập . Công việc tạo bảng trong MySQL là cơ bản với công cụ thích hợp. Tôi đang sử dụng dbForge Studio cho MySQL và Hình 1 và Hình 2 sau đây hiển thị cấu trúc bảng trực quan của cơ sở dữ liệu của tôi được trình bày bởi công cụ đó.
Tập lệnh cho các bảng dưới đây:
CREATE DATABASE IF NOT EXISTS `tv-series`;
USE `tv-series`;
CREATE TABLE `tv-series`.titles (
TitleID int NOT NULL AUTO_INCREMENT,
Title varchar(50) DEFAULT NULL,
`From` int DEFAULT NULL,
`To` int DEFAULT NULL,
PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE `tv-series`.episodes (
EpisodeID int NOT NULL AUTO_INCREMENT,
TitleID int DEFAULT NULL,
EpisodeTitle varchar(100) DEFAULT NULL,
AirDate date DEFAULT NULL,
Synopsis text DEFAULT NULL,
EpisodeNo int NOT NULL,
SeasonNo int NOT NULL,
PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);
Sau khi tạo cơ sở dữ liệu và bảng, chúng tôi có thể nhập dữ liệu của mình từ tệp Excel.
Công cụ đơn giản và mạnh mẽ nhất mà tôi đã sử dụng để nhập tệp Excel vào MySQL là dbForge Studio cho MySQL. Tôi đặc biệt đánh giá cao việc bổ sung một cột mới làm khóa chính trong bảng mục tiêu. Ngoài ra, định dạng ngày và giờ tự động phát hiện là sự hỗ trợ tuyệt vời. Nó chuyển đổi ngày tháng với kiểu dữ liệu văn bản và các định dạng ngày tháng kỳ lạ mà không phức tạp.
Vì chúng ta sẽ so sánh cú pháp MySQL với T-SQL, bạn cũng có thể nhập tệp Excel vào cơ sở dữ liệu mới trên SQL Server. Sau đó, sử dụng cùng một cơ sở dữ liệu và tên bảng như trong MySQL.
Thông tin thêm
- Công cụ xuất và nhập MySQL trong dbForge Studio dành cho MySQL
1. Xóa tất cả dữ liệu khỏi bảng
Đầu tiên, đơn giản nhất. Hãy thử sao lưu Tập bảng và sau đó xóa các bản ghi của bản sao lưu. Chúng tôi sẽ thực hiện thao tác xóa tất cả các hàng trong MySQL tiêu chuẩn mà bạn có thể cần thực hiện trong các tình huống khác nhau.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
Như bạn thấy, cú pháp giống như đối với T-SQL. Truy vấn sẽ xóa tất cả các bản ghi trong episode_backup bảng.
Một vài lưu ý cho bạn:
- Nếu bạn cần xóa nhiều hàng hoặc tất cả các hàng, BẢNG TRUNCATE nhanh hơn XÓA không có mệnh đề WHERE. Điều này đúng cho cả MySQL và SQL Server.
- Thực thi mã trên trong MySQL Workbench sẽ kích hoạt Mã lỗi 1175 . Nó không được phép vì MySQL Workbench mặc định cập nhật chế độ an toàn. Do đó, không được phép xóa hoặc cập nhật bảng không có mệnh đề WHERE. Tuy nhiên, bạn có thể tắt tính năng này trong Tùy chọn .
2. Xóa WHERE trong MySQL
Điểm thứ hai là về việc sử dụng DELETE với một điều kiện, MySQL xóa khỏi hoạt động chọn. Bằng cách này, bạn có thể xóa một hoặc nhiều bản ghi trong một câu lệnh, nhưng không phải tất cả chúng. Ví dụ:xóa hàng đầu tiên hoặc hàng / hàng cụ thể khác. Điều gì xảy ra nếu bạn đang tìm kiếm một cách làm thế nào để tránh các bản ghi trùng lặp trong SQL? Sử dụng điều kiện WHERE sẽ là giải pháp.
Một lần nữa, cú pháp giống nhau trong T-SQL:
-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;
-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);
Không có gì đặc biệt ở đây, nhưng phần tiếp theo sẽ khác.
3. GIỚI HẠN XÓA MySQL
GIỚI HẠN? GIỚI HẠN gì?
LIMIT tương đương với TOP trong T-SQL. Trước khi chúng ta có một ví dụ DELETE, chúng ta hãy xem các bản ghi truy vấn mà chúng ta sẽ xóa. Kiểm tra mã bên dưới:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Đây là GIỚI HẠN của bạn. Nó sẽ dẫn đến 2 bản ghi như trong Hình 3 cho chế độ xem thẻ trong dbForge Studio cho MySQL:
Bây giờ, hãy thử xóa chúng. Hãy xem ví dụ dưới đây:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Trước khi xóa 2 tập, MySQL đã truy vấn tất cả các tập từ năm 1987. Sau đó, nó sắp xếp chúng thành số phần và tập. Cuối cùng, nó giới hạn kết quả trong 2 bản ghi. Nó cũng là một phương pháp phù hợp khi chúng ta cần xóa các hàng trùng lặp. Nó cho phép chúng tôi chỉ định các điều kiện để xóa và đảm bảo rằng chúng tôi sẽ không xóa bất kỳ thứ gì cần thiết (nhưng việc sao lưu sẽ vẫn đảm bảo an toàn cho dữ liệu).
Có T-SQL tương đương không? Bạn có nghĩ điều này sẽ hiệu quả không?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
Nếu bạn dán đoạn mã trên vào SQL Server Management Studio, bạn sẽ nhận được các dòng nguệch ngoạc trong mệnh đề ORDER BY. Tuy nhiên, TOP vẫn được phép.
Tuy nhiên, nếu bạn loại bỏ mệnh đề ORDER BY, truy vấn của bạn sẽ xóa 2 bản ghi ngẫu nhiên. Cuối cùng, đoạn mã trên sẽ không chạy như mong đợi.
Để có kết quả tương tự như trong MySQL, bạn cần mã sau:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Nó dài hơn một chút trong T-SQL so với MySQL. Nhưng còn nhiều hơn thế nữa.
4. MySQL DELETE với JOIN
Một cách khác để xóa các bản ghi là sử dụng nó với một JOIN sẽ lọc các bản ghi mà bạn muốn xóa. Như nhiều người dùng định nghĩa, đó là tác vụ tham gia xóa MySQL. Không có gì khác khi bạn không sử dụng bí danh bảng. Kiểm tra ví dụ bên dưới:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
Điều này cũng sẽ hoạt động trong T-SQL. Nhưng nếu chúng ta sử dụng bí danh bảng như thế này:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
MySQL sẽ xuất hiện một lỗi. Dưới đây là cú pháp chính xác:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
Lưu ý sự khác biệt!
5. Xóa truy vấn con trong MySQL
Cuối cùng, chúng tôi thử sử dụng truy vấn con. Đó là một cách khác để lọc các bản ghi bạn muốn xóa. Bạn đã xem ví dụ trước đó, nhưng hãy cùng xem lại:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Đây là cú pháp hoàn toàn hợp lệ trong T-SQL. Nhưng nó sẽ hoạt động trong MySQL? Hãy thay đổi nó một chút:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
Giáo sư! Có vẻ như chúng ta đã va vào tường. Đây là những gì MySQL nói:
Phiên bản MySQL này chưa hỗ trợ ‘LIMIT &IN / ALL / ANY / SOME truy vấn con’
Điều gì sẽ xảy ra nếu chúng tôi xóa từ khóa LIMIT? Nó gây ra một lỗi khác:
Bạn không thể chỉ định "các tập" trong bảng mục tiêu cho bản cập nhật trong mệnh đề FROM.
Có một giải pháp thay thế? Thay đổi mã thành một truy vấn con lồng nhau sẽ chạy tốt:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 5) AS T)
Nên làm vậy. Nhưng hãy lấy một ví dụ hợp lý hơn:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
Bây giờ, vấn đề lớn với những ví dụ này là gì? Hãy xem:
- MySQL sẽ không chấp nhận câu lệnh DELETE với bộ lọc truy vấn con sử dụng từ khóa LIMIT. Chưa.
- MySQL sẽ không chấp nhận XÓA khỏi bảng đích tương đương với việc lọc bảng truy vấn con.
[sendpulse-form id =”13566 ″]
Kết luận
Càng xa càng tốt. Bạn có ba so sánh cú pháp DELETE cho MySQL và T-SQL. Tôi hy vọng phần thứ ba cũng sẽ hữu ích cho bạn trong tương lai.
Bài đăng này đã nêu bật cú pháp MySQL khi xóa
- Tất cả các bản ghi,
- 1 hoặc nhiều bản ghi có mệnh đề WHERE,
- Sử dụng LIMIT,
- Sử dụng JOIN,
- Sử dụng truy vấn con.
Bạn có thể dễ dàng thấy các cách thực hiện nhiệm vụ xóa cột của MySQL hoặc xóa bất kỳ hàng nào, nhiều hàng và các bản ghi cụ thể theo điều kiện.
Nếu bạn thích bài đăng này, hãy chia sẻ nó trên các nền tảng mạng xã hội yêu thích của bạn. Hãy cho chúng tôi biết suy nghĩ của bạn trong phần Nhận xét bên dưới.