Wednesday, May 30, 2007

Demo mã số học sinh tự sinh theo định dạng.

Vào console của mysql.
1. tạo database:
mysql>create database test;
2. chuyển qua database test:
mysql>use test;
3. tạo table hocsinh:
mysql>CREATE TABLE hocsinh(
id smallint PRIMARY KEY AUTO_INCREMENT ,
maso nvarchar( 11 ) NOT NULL default 'maso',
hoten nvarchar( 50 ) NOT NULL default 'ho ten hoc sinh',
namsinh smallint NOT NULL default '1984',
lop nvarchar( 8 ) NOT NULL default '02ct2b'
);
4. tạo trigger:
mysql>DELIMITER |
mysql>CREATE TRIGGER tg1 BEFORE INSERT ON hocsinh
FOR EACH ROW BEGIN
SET NEW.maso = CONCAT( NEW.lop, ( SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE table_schema = 'test' AND TABLE_NAME = 'hocsinh')) ;
END ;
|
mysql>DELIMITER ;

Vậy là xong. Khi insert một dòng mới vào bảng hocsinh bạn sẽ thấy mã số sẽ ra theo định dạng mong muốn.

Một số lưu ý:

AUTO_INCREMENT chỉ được áp dụng cho column thuộc khoá.
Khi dùng NEW trong trigger BEFORE thì cột có thuộc tính AUTO_INCREMENT sẽ có giá trị NULL (vì thực tế là chưa insert mà cho nên NEW.id = NULL)
Lệnh DELIMITER ; hay DELIMITER | dùng để định nghĩa lại kí tự kết thúc câu lệnh trong console của mysql.
-------------------------------------------------------------------------------
Các qui định với trigger trong MySQL
Một row OLD chỉ cho phép đọc, không cho phép sửa. Bạn có thể xem giá trị của nó, nhưng không có quyền sửa nó.
Trong BEFORE trigger, bạn có thể sửa giá trị của NEW ví dụ SET NEW.col_name = value. có nghĩa là bạn có quyền sửa lại giá trị của row sắp thêm vào table.
Trong BEFORE trigger, một column của NEW với thuộc tính AUTO_INCREMENT sẽ là 0, nó chưa có giá trị, chỉ khi nào row được thực sự thêm vào table thì nó mới được có giá trị.
Một trigger không được gọi một cách tường minh, chỉ khi nào một hành động có thể active nó xãy ra thì nó mới xãy ra.
Một trigger không được chứa START TRANSACTION, COMMIT, hay ROLLBACK.
Nếu một BEFORE trigger bị lỗi (fail) thì hành động gây ra trigger ví dụ insert hay update sẽ không được hoàn tất.
Một AFTER trigger chỉ được gọi khi BEFORE trigger được gọi thành công

1 comment:

Anonymous said...

cám ơn bài viết của bạn, bạn có thể gửi chương trình mẫu có trigger vào mail cho mình được không ? Nếu bạn có phần SP trong mysql bạn gửi luôn cho mình nữa nhé.
Mail: nobita61124@gmail.com