Trước sự thất vọng của các quản trị viên cơ sở dữ liệu trên toàn thế giới, trước phiên bản 12c của Oracle vào giữa năm 2014, Oracle đơn giản là không có khả năng vốn có để tạo các cột tự động tăng dần trong một lược đồ bảng. Mặc dù chỉ có thể đoán được lý do cho quyết định thiết kế này, nhưng tin tốt là ngay cả đối với người dùng trên các hệ thống Oracle cũ hơn, vẫn có một giải pháp khả thi để vượt qua cạm bẫy này và tạo cột khóa chính tự động tăng dần của riêng bạn.
Tạo một trình tự
Bước đầu tiên là tạo SEQUENCE
trong cơ sở dữ liệu của bạn, là đối tượng dữ liệu mà nhiều người dùng có thể truy cập để tự động tạo các giá trị gia tăng. Như đã thảo luận trong tài liệu, một chuỗi trong Oracle ngăn các giá trị trùng lặp được tạo đồng thời vì nhiều người dùng bị buộc phải “thay phiên nhau” trước khi mỗi mục tuần tự được tạo.
Với mục đích tạo khóa chính duy nhất cho một bảng mới, trước tiên chúng ta phải CREATE
bảng chúng tôi sẽ sử dụng:
CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100) NOT NULL
);
Tiếp theo, chúng ta cần thêm PRIMARY KEY
ràng buộc:
ALTER TABLE books
ADD (
CONSTRAINT books_pk PRIMARY KEY (id)
);
Cuối cùng, chúng tôi sẽ tạo SEQUENCE
của chúng tôi sẽ được sử dụng sau này để thực sự tạo ra giá trị tăng tự động, duy nhất.
CREATE SEQUENCE books_sequence;
Thêm trình kích hoạt
Trong khi chúng tôi đã tạo bảng của mình và sẵn sàng hoạt động, trình tự của chúng tôi cho đến nay vẫn chỉ ngồi ở đó nhưng không bao giờ được đưa vào sử dụng. Đây là nơi TRIGGERS
đi vào.
Tương tự với event
trong các ngôn ngữ lập trình hiện đại, TRIGGER
trong Oracle là một thủ tục được lưu trữ được thực thi khi một sự kiện cụ thể xảy ra.
Điển hình là TRIGGER
sẽ được định cấu hình để kích hoạt khi bảng được cập nhật hoặc bản ghi bị xóa, cung cấp một chút dọn dẹp khi cần thiết.
Trong trường hợp của chúng tôi, chúng tôi muốn thực thi TRIGGER
của chúng tôi trước INSERT
vào books
của chúng tôi bảng, đảm bảo SEQUENCE
của chúng tôi được tăng dần và giá trị mới đó được chuyển vào cột khóa chính của chúng tôi.
CREATE OR REPLACE TRIGGER books_on_insert
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
SELECT books_sequence.nextval
INTO :new.id
FROM dual;
END;
Ở đây chúng tôi đang tạo (hoặc thay thế nếu nó tồn tại) TRIGGER
được đặt tên là books_on_insert
và chỉ định rằng chúng tôi muốn trình kích hoạt kích hoạt BEFORE INSERT
xảy ra cho books
và có thể áp dụng cho bất kỳ và tất cả các hàng trong đó.
Bản thân 'mã' của trình kích hoạt khá đơn giản:Chúng tôi SELECT
giá trị gia tăng tiếp theo từ books_sequence
đã tạo trước đó của chúng tôi SEQUENCE
và chèn nó vào :new
bản ghi của books
trong .id
được chỉ định trường.
Lưu ý:FROM dual
một phần cần thiết để hoàn thành một truy vấn thích hợp nhưng không liên quan một cách hiệu quả. dual
bảng chỉ là một hàng dữ liệu giả duy nhất và được thêm vào, trong trường hợp này, chỉ để nó có thể bị bỏ qua và thay vào đó, chúng tôi có thể thực thi chức năng hệ thống của trình kích hoạt của chúng tôi thay vì trả về một số loại dữ liệu.
Cột IDENTITY
IDENTITY
các cột đã được giới thiệu trong Oracle 12c, cho phép chức năng tăng tự động đơn giản trong các phiên bản Oracle hiện đại.
Sử dụng IDENTITY
cột có chức năng tương tự như của các hệ thống cơ sở dữ liệu khác. Tạo lại books
ở trên của chúng tôi lược đồ bảng trong Oracle 12c hiện đại trở lên, chúng tôi chỉ cần sử dụng định nghĩa cột sau.
CREATE TABLE books (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
title VARCHAR2(100) NOT NULL
);