Với MySQL thì đã có AUTO_INCREMENT giúp tăng tự động cho trường khóa chính có kiểu dữ liệu là số nguyên, tuy nhiên với Oracle thì không có sẵn như vậy mà bạn phải kết hợp Sequence và Trigger để tạo sự kiện tăng ID lên 1 mỗi khi có thao tác Insert.

1. Các thiết lập ID tăng tư động trong Oracle

Giả sử mình cần tạo bảng dữ liệu TINTUC như sau:

Field Data Type
ID number, tăng tự động
TITLE varchar(200)
DESCRIPTION varchar(500)

Và đây là câu lệnh dùng để tạo bảng này.

CREATE TABLE TINTUC
(
    ID NUMBER PRIMARY KEY,
    TITLE VARCHAR(200),
    DESCRIPTION VARCHAR(500)
)

Câu lệnh này sẽ tạo một bảng TINTUC với ID là khóa chính, tuy nhiên nó không hề tăng tự động. Để nó tăng tự động mỗi khi insert thì bạn thực hiện các bước sau.

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

Tạo Sequence

Sau khi tạo thành công bảng TINTUC thì ta sẽ tạo một SEQUENCE giúp tự động tăng trường ID cho bảng này, ID này sẽ có giá trị bắt đầu từ 1 và tăng +1 mỗi khi có lệnh INSERT.

CREATE SEQUENCE AUTO_INCREMENT_SEQUENCE
START WITH 1
INCREMENT BY 1;

Ok vậy là xong, bây giờ ta cần tạo trigger.

Tạo Trigger

Chúng ta dùng một trigger để kích hoạt Sequence vừa tạo, trigger này sẽ gọi đến AUTO_INCREMENT_SEQUENCE để tăng trường ID lên 1 trước khi lệnh INSERT thực hiện.

CREATE OR REPLACE TRIGGER AUTO_INCREMENT_TRIGGER
BEFORE INSERTON
SINHVIEN
REFERENCING NEW AS NEW
	FOR EACH ROWBEGINSELECT
	AUTO_INCREMENT_SEQUENCE.NEXTVAL INTO :NEW.ID
	FROM DUAL;
END;
/

Như vậy là bạn đã thiết lập thành công tăng tự động rồi đấy.

Xem Thêm:   Lệnh Drop Trigger trong MySQL

Lưu ý: Lệnh này chỉ có tác dụng trên một bảng, vì vậy nếu bạn có N bảng thì phải thực hiện N lần nhé.

2. Lời kết

Qua bài này nhận thấy việc thiết lập này là cần thiết trong trường hợp bạn muốn khóa chính tăng tự động, nó sẽ giúp cho việc truy vấn dữ liệu trở nên nhanh hơn rất nhiều vì mọi thứ đều được sắp xếp có thứ tự.

Cá nhân mình đang sử dụng MySQL nên cảm thấy Oracle quá rườm rà, tại sao nó không tạo một thông số cho việc thiết lập này vì nhu cầu thực tế rất cần thiết.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *