Hướng dẫn casade delete trong mysql

Trong bài này chúng ta sẽ tìm hiểu lệnh Delete trong SQL Server. Delete được dùng để xóa một hoặc nhiều dòng dữ liệu trong bảng, thường kết hợp với lệnh Where để lọc dữ liệu.

Hướng dẫn casade delete trong mysql

Hướng dẫn casade delete trong mysql

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. Giới thiệu lệnh Delete trong SQL Server

Hầu như ứng dụng nào cũng có tính năng xóa dữ liệu. Ví dụ trong ứng dụng quản lý nhân viên sẽ có chức năng thêm / xóa / sửa.

  • Thêm thì sử dụng lệnh Insert
  • Xóa thì sử dụng lệnh Delete
  • Sửa thì sử dụng lệnh Update

Cú pháp của nó trong SQL Server như sau:

DELETE FROM table_name
WHERE condition;

Nếu bạn không truyền vào condition thì nó sẽ xóa toàn bộ dữ liệu của bảng. Vì vậy bạn nên test kỹ câu lệnh Delete trước khi thực hiện câu truy vấn.

Thông thường ta hay xóa theo khóa chính Primary Key. Ví dụ muốn xóa nhân viên có mã số sinh viên là SV002, đây thường là khóa chính của table SINHVIEN.

Bài viết này được đăng tại [free tuts .net]

Trường hợp xóa dữ liệu mà có ràng buộc khóa ngoại thì bạn phải xóa toàn bộ dữ liệu của bảng con có khóa ngoại trùng với khóa chính của nó đã nhé.

Ví dụ bạn muốn xóa phòng ban PB001 thì bước đầu tiên phải xóa toàn bộ nhân viên trong phòng, hoặc chuyển sang phòng ban khác để tránh bị thất lạc dữ liệu.

Nếu muốn đơn giản hơn thì sử dụng option ON DELETE CASCADE trong lúc tạo khóa ngoại nhé, nó sẽ giúp bạn tự động delete dữ liệu ở bảng con.

CREATE TABLE rooms (
    room_no INT PRIMARY KEY AUTO_INCREMENT,
    room_name VARCHAR(255) NOT NULL,
    building_no INT NOT NULL,
    FOREIGN KEY (building_no)
        REFERENCES buildings (building_no)
        ON DELETE CASCADE
);

2. Cách sử dụng Delete trong SQL Server

Chúng ta sẽ tiếp tục sử dụng table Employees làm ví dụ mẫu nhé.

Cấu trúc của nó như sau:

Hướng dẫn casade delete trong mysql

Lời khuyên: Bạn nên backup lại dữ liệu trước khi kiểm thử câu lệnh Delete nhé, bởi vì nó sẽ xóa vĩnh viễn và bạn không thể phục hồi được.

Giả sử mình muốn xóa tất cả nhân viên nằm trong phòng ban có mã officeCode = 4.

DELETE FROM employees 
WHERE
    officeCode = 4;

Xóa nhân viên có mã số employeeNumber = 200.

DELETE FROM employees 
WHERE
    employeeNumber = 200;

Xóa tất cả nhân viên trong bảng employees.

Lệnh cuối này nó gần giống như lệnh Truncate, điểm khác duy nhất là Delete xóa nhưng không reset lại chỉ số, còn Truncate thì có.

3. Delete kết hợp Limit trong SQL Server

Một điều khá đặc biệt mà ít người chú ý đến đó là bạn có thể kết hợp lệnh Order By và Limit để tạo ra khoảng giới hạn cần xóa.

Cú pháp như sau:

DELETE FROM table
LIMIT row_count;

Và để sắp xếp thì ta sẽ thêm câu lệnh Order By.

DELETE FROM table_name
ORDER BY c1, c2, ...
LIMIT row_count;

Ví dụ: Xóa 10 nhân viên đầu tiên và danh sách được sắp xếp theo tên nhân viên.

DELETE FROM customers
ORDER BY customerName
LIMIT 10;

Hoặc xóa 20 nhân viên đầu tiên sắp xếp theo employeeNumber.

DELETE FROM customers
ORDER BY employeeNumber
LIMIT 20;

Rất đơn giản phải không các bạn?

Như vậy là mình đã hướng dẫn xong cách sử dụng lệnh Delete trong SQL Server. Đây là lệnh khá là quan trọng, bởi nó được sử dụng ở hầu hết các ứng dụng để đưa vào tính năng xóa dữ liệu.

Tạo bảng Cơ sở dữ liệu

Sau khi chọn cơ sở dữ liệu (database) để thao tác:

use database_name;

Cấu trúc:

CREATE TABLE IF NOT EXISTS table_name(
    <column_name> <data_type> DEFAULT <default_value> [column constraints],
    ...
    <column_name> <data_type> DEFAULT <default_value> [column constraints],
    <table constraint>,
    ...
    <table constraint>
) type = table_type;

Phân tích cấu trúc:

IF NOT EXISTS => Đoạn này là điều kiện chỉ tạo bảng khi chưa có bảng nào trong cơ sở dữ liệu có tên như vậy (tránh trùng). table_name => Tên của bảng. column_name => Tên của cột. data_type => Kiểu dữ liệu của cột. Ví dụ: INT, VARCHAR,... default_value => giá trị mặc định được gán khi khởi tạo hàng mà không có giá trị nào được gán. column constraints => Ràng buộc mức cột. Ví dụ: NOT NULL, PRIMARY KEY, FOREIGN KEY, UNIQUE, AUTO_INCREMENT,... table constraint => Ràng buộc mức bảng, nó tạo ra ràng buộc cho nhiều cột. Ví dụ: (Cũng như cột trừ NOT NULL). table_type => Xác định kiểu bảng dữ liệu khi lưu trữ, để nhắm cho những mục đích lưu trữ khác nhau. Ví dụ: MyISAM, InnoDB, BerkeleyDB, (BDB), MERGE, HEAP...


Ví dụ 1:

CREATE TABLE IF NOT EXISTS demo_table_1(
	follower INT(11) NOT NULL PRIMARY KEY,
	following INT(11)
) ENGINE=InnoDB DEFAULT charset=utf8;

Phân tích ví dụ:

demo_table_1 => Là tên của bảng. follower, following => Là tên của các cột. INT => Kiểu dữ liệu số nguyên (4 bytes) NOT NULL => Là ràng buộc giá trị (value) của cột không được NULL. PRIMARY KEY => Là ràng buộc khóa chính. InnoDB => Kiểu lưu trữ hỗ trợ giao dịch an toàn, hỗ trợ khóa ngoài.


Ví dụ 2:

CREATE TABLE IF NOT EXISTS demo_table(
	number INT(11),
	name VARCHAR(50) NOT NULL,
	rate INT(11) DEFAULT 0,
	secret VARCHAR(50),
	follower INT(11) AUTO_INCREMENT,
	test VARCHAR(50),
	PRIMARY KEY (number),
	UNIQUE (test,secret),
	CONSTRAINT fk_follower FOREIGN KEY (follower)
	REFERENCES demo_table_1 (follower) ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

Phân tích ví dụ: (Phân tích thêm một số thứ chưa có ở ví dụ trên)

VARCHAR => Kiểu dữ liệu chuổi ký tự. AUTO_INCREMENT => Ràng buộc tự động tăng giá trị so với giá trị có hàng có trước trong bảng. UNIQUE => Ràng buộc giá trị mỗi hàng là duy nhất không trùng nhau. CONSTRAINT fk_follower => Đặt tên cho ràng buộc phía trước nó là: fk_follower. Giúp cho việc thông báo lỗi liên quan đến các ràng buộc, hay khi thao tác với các ràng buộc. FOREIGN KEY => Ràng buộc khóa ngoài. REFERENCES demo_table_1 (follower) => Tạo một số ràng buộc liên quan đến khóa ngoài tại cột follower của bảng demo_table_1. ON DELETE RESTRICT => Không cho xóa hàng khi còn có tham chiếu tới. ON UPDATE CASCADE => Khi dữ liệu bảng được tham chiếu thay đổi sẽ tự động cập nhật dữ liệu cho bảng tham chiếu tới. Ở Ví dụ này là khi thay đổi follower tại bảng demo_table_1 thì follower trên bảng demo_table sẽ được cập nhật.

Để hiển thị thông tin về bảng:

DESCRIBE table_name;

Ví dụ:

DESCRIBE demo_table_1;

Kết quả:

FieldTypeNullKeyDefaultExtra
follower int(11) NO PRI NULL
following int(11) YES NULL

Insert dữ liệu vào bảng

Cấu trúc

insert into `table_name`
(`colunm_1`, `colunm_2`, ..., `colunm_n` )
values 
(<value_11>, <value_12>, ..., <value_1n>),
(<value_21>, <value_22>, ..., <value_2n>),
...
(<value_n1>, <value_n2>, ..., <value_nn>);

Ví dụ:

insert into `demo_table_1`
(`follower`, `following` )
values 
(11, 12),
(55, 32);

Kết quả:

followerfollowing
11 12
55 32

Xóa bảng

Cấu trúc:

DELETE
FROM table_name
WHERE <condition>

Ví dụ:

DELETE
FROM demo_table_1
WHERE follower = 11;

Update bảng

Cấu trúc:

UPDATE table_name
SET colunm_name = <value>
WHERE <condition>;

Ví dụ:

UPDATE demo_table_1
SET follower = 96
WHERE following = 32 ;

Xóa bảng:

DROP TABLE IF EXISTS demo_table;

Video:

Cảm ơn mọi người đã đọc bài viết. Nếu có bất kỳ ý kiến hay góp ý gì hãy để lại bình luận ở dưới.