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

Cách xác định khóa chính tự động tăng dần trong Oracle

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
);

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lưu trữ Hùng do ORA-16484 TƯƠNG THÍCH

  2. Oracle IN so với Tồn tại sự khác biệt?

  3. Cách cập nhật Oracle Clob bằng cách sử dụng JDBC

  4. Oracle 11g:Mặc định thành giá trị tĩnh khi truy vấn không trả về gì

  5. Truy xuất IDENTITY được chèn lần cuối của Oracle