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

SQL DELETE cho người mới bắt đầu

Bài viết này chứa DELETE SQL cơ bản câu lệnh mà người mới bắt đầu có thể sử dụng để xóa dữ liệu khỏi bảng cơ sở dữ liệu của họ.

Xóa một hàng

Đây là một ví dụ cơ bản về DELETE của SQL tuyên bố.

DELETE FROM Owners
WHERE OwnerId = 5;

Trong trường hợp này, chúng tôi xóa hàng có OwnerId cột có giá trị là 4 .

DELETE câu lệnh bắt đầu bằng DELETE FROM , theo sau là tên bảng (tức là bảng chứa dữ liệu bạn muốn xóa).

Trong một số Hệ thống quản lý cơ sở dữ liệu (DBMS), FROM từ khóa là tùy chọn, nhưng bạn nên bao gồm từ khóa để có tính di động tốt hơn (trong trường hợp bạn cần chạy cùng một mã trên một DBMS khác).

Bạn phải luôn bao gồm WHERE , trừ khi bạn muốn xóa tất cả các hàng khỏi bảng.

Bạn đã đọc đúng. Bỏ qua WHERE mệnh đề sẽ xóa tất cả các hàng trong bảng.

Hầu hết các DBMS có nhiều tùy chọn khác nhau mà bạn có thể sử dụng với DELETE nhưng những câu được liệt kê ở đây là những câu được sử dụng phổ biến nhất.

Lưu ý rằng DELETE câu lệnh xóa toàn bộ hàng. Bạn không thể xóa giá trị của một cột riêng lẻ trong một hàng. Để thực hiện việc này, hãy sử dụng UPDATE của SQL tuyên bố.

Ví dụ

Trong ví dụ này, chúng tôi xóa dữ liệu khỏi bảng.

Trước hết, hãy xem những gì có trong bảng.

SELECT * FROM Owners;

Kết quả:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Stallone   | (489) 591-0408 | NULL              |
| 4         | Boris       | Biden      | (349) 611-8908 | [email protected] |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

Được rồi, hãy xóa chủ sở hữu số 5, sau đó chọn lại bảng.

DELETE FROM Owners
WHERE OwnerId = 5;

SELECT * FROM Owners;

Kết quả:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Stallone   | (489) 591-0408 | NULL              |
| 4         | Boris       | Biden      | (349) 611-8908 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

Chúng ta có thể thấy rằng hàng cuối cùng đã bị xóa như được chỉ định.

Phím ngoại

Bạn có thể gặp lỗi nếu cố xóa dữ liệu được tham chiếu bởi khóa ngoại trong một bảng khác. Điều này là do bảng bạn đang cố gắng xóa dữ liệu khỏi bảng chính trong một mối quan hệ. Bảng có khóa ngoại (bảng con) dựa vào dữ liệu trong bảng mẹ (tức là dữ liệu mà bạn đang cố xóa).

Việc bạn có gặp lỗi hay không sẽ phụ thuộc vào cách cấu hình khóa ngoại. Hầu hết các DBMS đều hỗ trợ các tùy chọn khác nhau để đối phó với tình huống này. Các tùy chọn như vậy có thể bao gồm, phát sinh lỗi, xếp tầng xóa vào bảng khóa ngoại (tức là xóa hàng khỏi bảng con), đặt khóa ngoại thành NULL hoặc đặt nó thành giá trị mặc định.

Dưới đây là một ví dụ về việc cố gắng xóa một hàng được tham chiếu bởi khóa ngoại.

DELETE FROM Owners
WHERE OwnerId = 3;

Kết quả:

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'.

The statement has been terminated.

Trong trường hợp này, một lỗi đã được phát sinh và hàng không bị xóa.

Trong ví dụ này, Owners.OwnerId là khóa chính của bảng này. Một bảng khác có tên là PetsOwnerId cột tham chiếu đến cột khóa chính này và trong trường hợp này, có ít nhất một hàng tham chiếu đến chủ sở hữu số 3.

Nếu tôi thực sự muốn xóa hàng này, tôi cần cập nhật dữ liệu trong bảng con để không có hàng nào trỏ đến chủ sở hữu này. Hoặc điều đó, hoặc sửa đổi khóa ngoại để nó sử dụng một tùy chọn khác khi thao tác xóa xảy ra trên khóa chính. Sửa đổi khóa ngoại có thể là một tùy chọn không mong muốn, tùy thuộc vào những gì bạn cần làm. Tùy thuộc vào DBMS của bạn, nó cũng có thể yêu cầu bỏ khóa hiện có và tạo lại nó.

Trong mọi trường hợp, lỗi này là một điều tốt, vì nó cảnh báo chúng tôi về một vấn đề mà chúng tôi sẽ gặp phải nếu chúng tôi xóa hàng này. Nó giúp thực thi tính toàn vẹn của tham chiếu.

Thận trọng! Quên WHERE Mệnh đề

DELETE tuyên bố có thể là một tuyên bố rất nguy hiểm. Nếu bạn bỏ qua WHERE điều khoản, bạn sẽ xóa tất cả hàng trong bảng.

May mắn thay, bạn có thể được cứu bởi các ràng buộc khóa ngoại nếu bạn cố gắng xóa dữ liệu khỏi bảng mẹ của một mối quan hệ.

Nhưng nếu không thì sao. Điều gì sẽ xảy ra nếu không có lỗi nào được nêu ra bởi các tuyên bố xóa của bạn?

Hãy cùng tìm hiểu!

Hãy chạy một DELETE khác nhưng lần này chúng tôi sẽ quên bao gồm WHERE mệnh đề. Ngoài ra, lần này chúng tôi sẽ chạy nó với một bảng không phải là bảng gốc trong một mối quan hệ.

Trước tiên, hãy xem những gì có trong bảng.

SELECT * FROM Pets;

Kết quả:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Được rồi, chúng tôi có tám con vật cưng. Chúng ta thực sự có thể thấy rằng ba vật nuôi thuộc sở hữu của chủ sở hữu số 3 - chủ sở hữu mà chúng tôi đã cố gắng xóa trong ví dụ trước. Đây là lý do tại sao chúng tôi gặp lỗi.

Dù sao, hãy tiếp tục và chạy DELETE của chúng tôi câu lệnh không có WHERE , sau đó kiểm tra lại bảng

DELETE FROM Pets;

SELECT * FROM Pets;

Kết quả:

(8 rows affected)
(0 rows affected)

(8 rows affected) một phần có nghĩa là tám hàng đã bị xóa.

(0 rows affected) nghĩa là không có hàng nào được chọn (vì không có hàng nào trong bảng.

Rất tiếc!

Có thể có những lúc bạn cần xóa tất cả các hàng trong bảng. Tùy thuộc vào kích thước của bảng, câu lệnh này sẽ là tất cả những gì bạn cần.

Nếu bạn cần xóa một bảng lớn hơn, thì cũng có TRUNCATE TABLE , loại bỏ tất cả các hàng khỏi bảng hoặc các phân vùng được chỉ định của bảng, mà không ghi nhật ký các lần xóa hàng riêng lẻ (DELETE câu lệnh ghi nhật ký các lần xóa này).

Do đó, TRUNCATE TABLE nhanh hơn và sử dụng ít tài nguyên hệ thống và nhật ký giao dịch hơn.

Ví dụ về việc sử dụng TRUNCATE TABLE :

TRUNCATE TABLE Owners;

Lưu ý rằng điều này có thể không hoạt động nếu bảng đang được tham chiếu bởi một ràng buộc khóa ngoại, ngay cả khi không có hàng con nào. Trong những trường hợp như vậy, DELETE có thể hoạt động thay thế.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiệu suất Bất ngờ và Giả định:DATEDIFF

  2. Cách sắp xếp trong SQL

  3. Cách sử dụng mệnh đề GROUP BY trong SQL

  4. Định dạng ngày trong SQL:Cách xử lý nó theo cách thông minh

  5. Toán tử so sánh SQL