Cách Xóa Dữ Liệu Trong SQL
Có thể bạn quan tâm
Hướng dẫn này sẽ trình bày cách sử dụng cú pháp DELETE của SQL để xóa dữ liệu khỏi một hoặc nhiều bảng. Nó cũng sẽ giải thích cách SQL xử lý các hoạt động DELETE xung đột với các ràng buộc foreign keys .
Yêu cầu
Để làm theo hướng dẫn này, bạn cần một máy tính chạy một số loại hệ quản trị database quan hệ (RDBMS) sử dụng SQL. Các hướng dẫn và ví dụ trong hướng dẫn này đã được kiểm nghiệm bằng cách sử dụng môi trường sau:
- Server chạy Ubuntu 20.04, với user không phải root có quyền quản trị và firewall được cấu hình bằng UFW, như được mô tả trong hướng dẫn cài đặt server ban đầu của ta cho Ubuntu 20.04 .
- MySQL được cài đặt và bảo mật trên server , như được nêu trong Cách cài đặt MySQL trên Ubuntu 20.04 . Hướng dẫn này đã được xác minh với user MySQL không phải root, được tạo bằng quy trình được mô tả trong Bước 3 .
Lưu ý : Xin lưu ý nhiều RDBMS sử dụng các triển khai SQL duy nhất của riêng họ. Mặc dù các lệnh được nêu trong hướng dẫn này sẽ hoạt động trên hầu hết các RDBMS, nhưng cú pháp hoặc kết quả chính xác có thể khác nếu bạn kiểm tra chúng trên một hệ thống không phải MySQL.
Bạn cũng cần một database và bảng được tải với một số dữ liệu mẫu mà bạn có thể sử dụng để thực hành xóa dữ liệu. Ta khuyến khích bạn đọc phần Kết nối với MySQL và Cài đặt Database Mẫu sau đây để biết chi tiết về cách tạo database và hai bảng mà hướng dẫn này sẽ sử dụng trong các ví dụ xuyên suốt.
Kết nối với MySQL và cài đặt database mẫu
Nếu hệ thống database SQL của bạn chạy trên một server từ xa, hãy SSH vào server của bạn từ máy local của bạn:
- ssh sammy@your_server_ip
Sau đó, mở dấu nhắc server MySQL, thay thế sammy bằng tên account user MySQL của bạn:
- mysql -u sammy -p
Tạo database có tên deleteDB :
- CREATE DATABASE deleteDB;
Nếu database được tạo thành công, bạn sẽ nhận được kết quả như sau:
OutputQuery OK, 1 row affected (0.01 sec)Để chọn database deleteDB , hãy chạy câu lệnh USE sau:
- USE deleteDB;
Sau khi chọn database deleteDB , hãy tạo một vài bảng bên trong nó. Ví dụ, hãy tưởng tượng rằng bạn và một số người bạn của bạn bắt đầu một câu lạc bộ, trong đó các thành viên có thể chia sẻ thiết bị âm nhạc với nhau. Để giúp bạn theo dõi các thành viên câu lạc bộ và thiết bị của họ, bạn quyết định tạo một vài bảng. Bảng đầu tiên sẽ có bốn cột sau:
- memberID : mã số nhận dạng của từng thành viên câu lạc bộ, được thể hiện bằng kiểu dữ liệu int . Cột này cũng sẽ đóng role là khóa chính của bảng
- name : name mỗi thành viên, được thể hiện bằng kiểu dữ liệu varchar với tối đa 30 ký tự
- homeBorough : cột này sẽ lưu trữ khu vực mà mỗi thành viên sinh sống, được thể hiện bằng kiểu dữ liệu varchar nhưng chỉ có tối đa 15 ký tự
- email : địa chỉ email mà mỗi thành viên có thể được liên hệ, được thể hiện bằng kiểu dữ liệu varchar với tối đa 30 ký tự
Tạo một bảng có tên clubMembers có bốn cột sau:
- CREATE TABLE clubMembers (
- memberID int PRIMARY KEY,
- name varchar(30),
- homeBorough varchar(15),
- email varchar(30)
- );
Bảng tiếp theo sẽ có các cột sau:
- equipmentID : một mã định danh duy nhất cho từng thiết bị. Các giá trị trong cột này sẽ thuộc kiểu dữ liệu int . Giống như memberID cột trong clubMembers bảng, cột này sẽ đóng role là khóa chính của bảng
- equipmentType : loại nhạc cụ hoặc công cụ mà mỗi hàng đại diện (ví dụ: guitar , mixer , amplifier , v.v.). Các giá trị này sẽ được thể hiện bằng kiểu dữ liệu varchar với tối đa 30 ký tự
- brand : thương hiệu production từng bộ phận của thiết bị, được thể hiện lại bằng cách sử dụng kiểu dữ liệu varchar với tối đa 30 ký tự
- ownerID : cột này sẽ chứa số ID của thành viên câu lạc bộ sở hữu trang bị, được biểu thị dưới dạng số nguyên.
Để đảm bảo các cột ownerID chỉ chứa các giá trị đại diện cho số thành viên ID hợp lệ, bạn có thể tạo một ràng buộc khoá ngoại tham chiếu đến các clubMember bảng của memberID cột. Ràng buộc foreign keys là một cách để thể hiện mối quan hệ giữa hai bảng. Khóa ngoại thực hiện điều này bằng cách yêu cầu các giá trị trong cột mà nó áp dụng phải đã tồn tại trong cột mà nó tham chiếu. Trong ví dụ sau, ràng buộc foreign keys yêu cầu bất kỳ giá trị nào được thêm vào cột ownerID phải tồn tại trong cột memberID .
Tạo một bảng với các cột này và ràng buộc này có tên là clubEquipment :
- CREATE TABLE clubEquipment (
- equipmentID int PRIMARY KEY,
- equipmentType varchar(30),
- brand varchar(15),
- ownerID int,
- CONSTRAINT fk_ownerID
- FOREIGN KEY (ownerID) REFERENCES clubMembers(memberID)
- );
Lưu ý ví dụ này cung cấp tên cho ràng buộc foreign keys , fk_ownerID . MySQL sẽ tự động tạo tên cho bất kỳ ràng buộc nào bạn thêm vào, nhưng việc xác định một ràng buộc ở đây sẽ hữu ích khi ta cần tham chiếu đến ràng buộc này sau này.
Tiếp theo, chạy INSERT INTO sau để tải bảng clubMembers với sáu hàng dữ liệu mẫu:
- INSERT INTO clubMembers
- VALUES
- (1, 'Rosetta', 'Manhattan', 'hightower@example.com'),
- (2, 'Linda', 'Staten Island', 'lyndell@example.com'),
- (3, 'Labi', 'Brooklyn', 'siffre@example.com'),
- (4, 'Bettye', 'Queens', 'lavette@example.com'),
- (5, 'Phoebe', 'Bronx', 'snow@example.com'),
- (6, 'Mariya', 'Brooklyn', 'takeuchi@example.com');
Sau đó, chạy một INSERT INTO để tải bảng clubEquipment với 20 hàng dữ liệu mẫu:
- INSERT INTO clubEquipment
- VALUES
- (1, 'electric guitar', 'Gilled', 6),
- (2, 'trumpet', 'Yemehe', 5),
- (3, 'drum kit', 'Purl', 3),
- (4, 'mixer', 'Bearinger', 3),
- (5, 'microphone', 'Sure', 1),
- (6, 'bass guitar', 'Fandar', 4),
- (7, 'acoustic guitar', 'Marten', 6),
- (8, 'synthesizer', 'Korgi', 4),
- (9, 'guitar amplifier', 'Vax', 4),
- (10, 'keytar', 'Poland', 3),
- (11, 'acoustic/electric bass', 'Pepiphone', 2),
- (12, 'trombone', 'Cann', 2),
- (13, 'mandolin', 'Rouge', 1),
- (14, 'electric guitar', 'Vax', 6),
- (15, 'accordion', 'Nonher', 5),
- (16, 'electric organ', 'Spammond', 1),
- (17, 'bass guitar', 'Peabey', 1),
- (18, 'guitar amplifier', 'Fandar', 3),
- (19, 'cello', 'Yemehe', 2),
- (20, 'PA system', 'Mockville', 5);
Như vậy, bạn đã sẵn sàng làm theo phần còn lại của hướng dẫn và bắt đầu tìm hiểu về cách xóa dữ liệu bằng SQL.
Xóa dữ liệu khỏi một bảng
Cú pháp chung để xóa dữ liệu trong SQL trông giống như sau:
- DELETE FROM table_name
- WHERE conditions_apply;
Cảnh báo : Phần quan trọng của cú pháp này là WHERE , vì đây là WHERE đề cho phép bạn chỉ định chính xác những hàng dữ liệu nào sẽ bị xóa. Nếu không có nó, một lệnh như DELETE FROM table_name ; sẽ thực thi chính xác, nhưng nó sẽ xóa mọi hàng dữ liệu khỏi bảng.
Lưu ý thao tác DELETE thành công là không phục hồi được . Nếu bạn định chạy một file mà không biết chính xác dữ liệu nào sẽ xóa, có khả năng bạn vô tình xóa nhầm các bản ghi. Một cách để giúp đảm bảo bạn không vô tình xóa nhầm dữ liệu là trước tiên đưa ra một truy vấn SELECT để xem dữ liệu nào sẽ được trả về bởi WHERE của hoạt động DELETE .
Để minh họa, giả sử bạn muốn xóa mọi bản ghi liên quan đến thiết bị âm nhạc do thương hiệu Korgi production . Tuy nhiên, để an toàn, trước tiên bạn quyết định viết một truy vấn để xem chính xác profile thiết bị nào liệt kê Korgi trong cột brand của họ.
Để tìm nhạc cụ nào trong bảng của bạn do Korg production , bạn có thể chạy truy vấn sau. Lưu ý không giống như truy vấn SELECT hoặc hoạt động INSERT INTO , hoạt động DELETE không cho phép bạn chỉ định các cột riêng lẻ, vì chúng nhằm xóa toàn bộ các hàng dữ liệu. Để bắt chước hành vi này, truy vấn này theo sau từ khóa SELECT với dấu hoa thị ( * ), đây là cách viết tắt của SQL và đại diện cho “mọi cột”:
- SELECT * FROM clubEquipment
- WHERE brand = 'Korgi';
Truy vấn này trả về mọi cột từ bảng clubEquipment , nhưng chỉ trả về các hàng có cột brand chứa giá trị Korgi :
Output+-------------+---------------+-------+---------+ | equipmentID | equipmentType | brand | ownerID | +-------------+---------------+-------+---------+ | 8 | synthesizer | Korgi | 4 | +-------------+---------------+-------+---------+ 1 row in set (0.00 sec)Để xóa hàng này, bạn sẽ chạy một thao tác DELETE có WHERE đề FROM và WHERE giống với SELECT trước đó:
- DELETE FROM clubEquipment
- WHERE brand = 'Korgi';
Đầu ra này cho biết thao tác DELETE chỉ ảnh hưởng đến một hàng duy nhất. Tuy nhiên, bạn có thể xóa nhiều hàng dữ liệu với bất kỳ WHERE nào trả về nhiều hơn một hàng.
Sau đây SELECT truy vấn trả về mọi kỷ lục trong clubEquipment bảng mà equipmentType cột chứa từ electric :
- SELECT * FROM clubEquipment
- WHERE equipmentType LIKE '%electric%';
, để xóa bốn bản ghi này, hãy viết lại thao tác truy vấn này nhưng thay thế SELECT * bằng DELETE :
- DELETE FROM clubEquipment
- WHERE equipmentType LIKE '%electric%';
Bạn cũng có thể sử dụng truy vấn con để trả lại và xóa các tập hợp kết quả chi tiết hơn. Truy vấn con là một hoạt động truy vấn hoàn chỉnh - nghĩa là, một câu lệnh SQL bắt đầu bằng SELECT và bao gồm mệnh đề FROM - được nhúng trong một hoạt động khác, theo sau mệnh đề FROM của chính hoạt động xung quanh.
Ví dụ: giả sử bạn muốn xóa bất kỳ thiết bị nào được liệt kê trong bảng Thiết bị câu clubEquipment thuộc sở hữu của bất kỳ thành viên nào có tên bắt đầu bằng chữ cái “L.” Trước tiên, bạn có thể truy vấn dữ liệu này bằng một câu lệnh như sau:
- SELECT *
- FROM clubEquipment
- WHERE ownerID IN
- (SELECT memberID FROM clubMembers
- WHERE name LIKE 'L%');
Thao tác này trả về mọi hàng từ bảng clubEquipment có cột ownerID xuất hiện trong các giá trị được trả về bởi truy vấn con bắt đầu từ dòng thứ tư. Truy vấn con này trả về memberID of any record whose giá trị tên` bắt đầu bằng “L”:
Output+-------------+------------------+-----------+---------+ | equipmentID | equipmentType | brand | ownerID | +-------------+------------------+-----------+---------+ | 12 | trombone | Cann | 2 | | 19 | cello | Yemehe | 2 | | 3 | drum kit | Purl | 3 | | 4 | mixer | Bearinger | 3 | | 10 | keytar | Poland | 3 | | 18 | guitar amplifier | Fandar | 3 | +-------------+------------------+-----------+---------+ 6 rows in set (0.00 sec)Sau đó, bạn có thể xóa dữ liệu này bằng câu lệnh DELETE sau:
- DELETE FROM clubEquipment
- WHERE ownerID IN
- (SELECT memberID FROM clubMembers
- WHERE name LIKE 'L%');
Xóa dữ liệu khỏi nhiều bảng
Bạn có thể xóa dữ liệu khỏi nhiều bảng trong một thao tác bằng cách thêm mệnh đề JOIN .
Mệnh đề JOIN được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng thành một kết quả truy vấn duy nhất. Họ làm điều này bằng cách tìm một cột liên quan giữa các bảng và sắp xếp kết quả một cách thích hợp trong kết quả .
Cú pháp của thao tác DELETE bao gồm mệnh đề JOIN trông giống như sau:
- DELETE table_1, table_2
- FROM table_1 JOIN table_2
- ON table_2.related_column = table_1.related_column
- WHERE conditions_apply;
Lưu ý vì mệnh đề JOIN so sánh nội dung của nhiều hơn một bảng, nên cú pháp ví dụ này chỉ định bảng để chọn từng cột bằng cách đặt trước tên của cột với tên của bảng và dấu chấm. Đây được gọi là tham chiếu cột đủ điều kiện . Bạn có thể chỉ định bảng nào nên chọn cột như thế này cho bất kỳ thao tác nào, mặc dù không cần thiết khi chỉ chọn từ một bảng như ta đã làm trong các ví dụ trước.
Để minh họa việc xóa dữ liệu bằng điều khoản JOIN , giả sử câu lạc bộ của bạn quyết định giới hạn những nhãn hiệu thiết bị âm nhạc mà thành viên có thể chia sẻ. Chạy câu lệnh sau để tạo một bảng có tên là Thương hiệu prohibitedBrands trong đó bạn sẽ liệt kê những nhãn hiệu không còn được chấp nhận cho câu lạc bộ. Bảng này chỉ có hai cột, cả hai đều sử dụng kiểu dữ liệu varchar , để chứa tên của từng thương hiệu và quốc gia mà họ hoạt động:
- CREATE TABLE prohibitedBrands (
- brandName varchar(30),
- homeCountry varchar(30)
- );
Sau đó tải bảng mới này với một số dữ liệu mẫu:
- INSERT INTO prohibitedBrands
- VALUES
- ('Fandar', 'USA'),
- ('Givson', 'USA'),
- ('Muug', 'USA'),
- ('Peabey', 'USA'),
- ('Yemehe', 'Japan');
Sau đó, câu lạc bộ quyết định xóa bất cứ profile thiết bị từ clubEquipment bảng có nhãn hiệu xuất hiện trong prohibitedBrands bảng và có trụ sở tại USA .
Bạn có thể truy vấn dữ liệu này bằng một thao tác như SELECT sau đây. Thao tác này gia nhập clubEquipment và prohibitedBrands bảng với nhau, chỉ trả lại hàng mà brand và brandName cột chia sẻ một giá trị chung. WHERE tinh chỉnh thêm bộ kết quả này bằng cách loại trừ bất kỳ thương hiệu nào có cột homeCountry không bao gồm USA dưới dạng giá trị của nó:
- SELECT *
- FROM clubEquipment JOIN prohibitedBrands
- ON clubEquipment.brand = prohibitedBrands.brandName
- WHERE homeCountry = 'USA';
Đó là tất cả thông tin ta đang tìm kiếm; cụ thể là từng thương hiệu có trụ sở tại USA trong bảng Thương hiệu prohibitedBrands cũng xuất hiện trong bảng clubEquipment bộ clubEquipment .
Để xóa các thương hiệu này khỏi bảng prohbitedBrands và các thiết bị liên quan khỏi clubEquipment , hãy viết lại SELECT trước đó nhưng thay thế SELECT * bằng DELETE theo sau là tên của cả hai bảng:
- DELETE clubEquipment, prohibitedBrands
- FROM clubEquipment JOIN prohibitedBrands
- ON clubEquipment.brand = prohibitedBrands.brandName
- WHERE homeCountry = 'USA';
Kết quả kết quả này cho biết thao tác đã xóa bốn hàng dữ liệu: hai hàng từ clubEquipment và hai hàng từ prohibitedBrands clubEquipment . Nếu bạn chỉ muốn xóa các bản ghi khỏi bảng clubEquipment và duy trì tất cả các bản ghi trong bảng prohibitedBrands clubEquipment , bạn sẽ chỉ liệt kê clubEquipment sau từ khóa DELETE và ngược lại.
Thay đổi hành vi DELETE foreign keys
Theo mặc định, bất kỳ câu lệnh DELETE nào gây ra xung đột với foreign keys sẽ không thành công.
Nhớ lại phần Kết nối với MySQL và Cài đặt Database Mẫu của Yêu cầu rằng cột ownerID của bảng clubEquipment là foreign keys tham chiếu đến cột ownerID của clubEquipment . Điều này nghĩa là bất kỳ giá trị nào được nhập vào cột ownerID phải tồn tại trong cột memberID .
Nếu bạn cố gắng xóa một hàng dữ liệu khỏi bảng clubMembers có giá trị memberID được sử dụng ở bất kỳ vị trí nào trong cột ownerID , nó sẽ gây ra lỗi:
- DELETE FROM clubMembers
- WHERE memberID = 6;
Bạn có thể tránh lỗi này bằng cách đầu tiên loại bỏ bất kỳ hàng trong bảng con ( clubEquipment trong ví dụ này), nơi các giá trị chính nước ngoài tồn tại trong bảng cha ( clubMembers ).
Ngoài ra, bạn có thể thay đổi hành vi này bằng cách thay thế ràng buộc foreign keys hiện có bằng một ràng buộc xử lý các hoạt động DELETE cách khác.
Lưu ý : Không phải mọi hệ thống hoặc công cụ quản lý database đều cho phép bạn thêm hoặc xóa một ràng buộc khỏi một bảng hiện có như được nêu trong các đoạn sau. Nếu bạn đang sử dụng RDBMS không phải MySQL, bạn nên tham khảo tài liệu chính thức của nó để hiểu nó có những hạn chế nào đối với việc quản lý các ràng buộc.
Để thay thế ràng buộc hiện tại, trước tiên bạn phải loại bỏ nó bằng một ALTER TABLE . Nhớ lại rằng trong câu CREATE TABLE cho clubEquipment , ta đã định nghĩa fk_ownerID làm tên cho ràng buộc foreign keys của bảng:
- ALTER TABLE clubEquipment
- DROP FOREIGN KEY fk_ownerID;
Sau đó, tạo một ràng buộc foreign keys mới được cấu hình để xử lý các hoạt động DELETE theo cách phù hợp với trường hợp sử dụng nhất định. Ngoài cài đặt mặc định cấm các câu lệnh DELETE vi phạm foreign keys , có hai tùy chọn khác có sẵn trên hầu hết các RDBMS:
- ON DELETE SET NULL : Tùy chọn này sẽ cho phép bạn xóa các bản ghi khỏi bảng mẹ và sẽ đặt lại bất kỳ giá trị nào trong bảng con tham chiếu chúng là NULL .
- ON DELETE CASCADE : Khi bạn xóa một hàng trong bảng mẹ, tùy chọn này sẽ khiến SQL tự động xóa bất kỳ bản ghi nào tham chiếu đến nó trong bảng con.
Đối với mục đích của ví dụ này, ON DELETE SET NULL không có ý nghĩa. Nếu một thành viên rời khỏi câu lạc bộ và thu âm của họ được lấy ra từ các clubMembers bảng, thiết bị của họ không còn có sẵn cho các thành viên còn lại và do đó cần được loại bỏ từ clubEquipment bảng. Do đó, tùy chọn ON DELETE CASCADE có ý nghĩa hơn đối với mục đích của ta .
Để thêm một ràng buộc foreign keys tuân theo hành vi ON DELETE CASCADE , hãy chạy ALTER TABLE sau. Điều này tạo ra một ràng buộc mới có tên newfk_ownerID sao chép định nghĩa foreign keys trước đó, nhưng bao gồm tùy chọn ON DELETE CASCADE :
- ALTER TABLE clubEquipment
- ADD CONSTRAINT newfk_ownerID
- FOREIGN KEY (ownerID)
- REFERENCES clubMembers(memberID)
- ON DELETE CASCADE;
Kết quả này cho biết nó đã ảnh hưởng đến tất cả bảy hàng còn lại trong bảng clubEquipment bộ clubEquipment .
Lưu ý : Thay vì thay đổi định nghĩa của bảng để thay đổi cách foreign keys xử lý các hoạt động DELETE , bạn có thể xác định hành vi này ngay từ đầu trong câu CREATE TABLE như sau:
- CREATE TABLE clubEquipment (
- equipmentID int PRIMARY KEY,
- equipmentType varchar(30),
- brand varchar(15),
- ownerID int,
- CONSTRAINT fk_ownerID
- FOREIGN KEY (ownerID) REFERENCES clubMembers(memberID)
- ON DELETE CASCADE
- );
Sau đó, bạn có thể xóa bất kỳ bản ghi nào khỏi bảng clubMembers và bất kỳ hàng nào trong bảng clubEquipment tham chiếu đến nó cũng sẽ bị xóa:
- DELETE FROM clubMembers
- WHERE memberID = 6;
Mặc dù kết quả này cho biết nó chỉ ảnh hưởng đến một hàng, nhưng nó cũng sẽ xóa mọi bản ghi thiết bị trong bảng clubEquipment bộ thiết bị liệt kê giá trị ownerID của chúng là 6 .
Kết luận
Bằng cách đọc hướng dẫn này, bạn đã học cách xóa dữ liệu khỏi một hoặc nhiều bảng bằng cách sử dụng câu lệnh DELETE . Bạn cũng đã học cách SQL xử lý các hoạt động DELETE xung đột với các ràng buộc foreign keys và cách thay đổi hành vi mặc định đó.
Các lệnh được nêu ở đây sẽ hoạt động trên bất kỳ hệ quản trị database nào sử dụng SQL. Lưu ý mọi database SQL sử dụng cách triển khai ngôn ngữ duy nhất của riêng nó, vì vậy bạn nên tham khảo tài liệu chính thức của DBMS để có mô tả đầy đủ hơn về cách nó xử lý câu DELETE và những tùy chọn nào có sẵn cho nó.
Nếu bạn muốn tìm hiểu thêm về cách làm việc với SQL, ta khuyến khích bạn xem các hướng dẫn khác trong loạt bài này về Cách sử dụng SQL .
Tags:Các tin liên quan
Từ khóa » Xóa Dữ Liệu 1 Cột Trong Sql
-
Xóa Column Trong SQL Server - Vi
-
Mệnh đề DELETE Xóa Dữ Liệu Trong SQL
-
Thêm, Cập Nhật Và Xóa Dữ Liệu Trong SQL Server - Tin Học 88
-
Lệnh DELETE Trong SQL Server
-
Xóa Dữ Liệu 1 Cột Trong Sql
-
SQL | DELETE - Xoá Dữ Liệu Trong SQL - Deft Blog
-
Xóa Column Trong SQL Server - Freetuts
-
Xóa Dữ Liệu 1 Cột Trong Sql
-
Lệnh DELETE Trong SQL, Cú Pháp Và Cách Sử Dụng - Thủ Thuật
-
Cú Pháp Xóa Dữ Liệu DELETE Và TRUNCATE Trong SQL Server
-
Xóa Dữ Liệu 1 Cột Trong Sql - Vietmac
-
ALTER TABLE DROP COLUMN Trong SQL Server