Không phải tất cả SQL đều giống nhau. Cả Oracle và MySQL đều không hỗ trợ tiêu chuẩn SQL thực tế của IDENTITY.
Oracle không sử dụng dấu gạch ngược ... bạn thực sự không cần phải trích dẫn số nhận dạng của mình. Tốt hơn là không nên làm như vậy, bạn sẽ không vô tình sử dụng một ký tự không hợp lệ trong số nhận dạng.
Các số trong Oracle được gọi là NUMBER và có thể có độ chính xác và tỷ lệ tùy chọn.
CREATE TABLE Category
(
id NUMBER(11) NOT NULL,
title VARCHAR2(45) NULL,
PRIMARY KEY (id)
)
Để thực hiện AUTO_INCREMENT, hãy tạo một chuỗi:
CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;
Sau đó, khi bạn chèn vào bảng, hãy thực hiện như sau:
INSERT INTO category
VALUES (seq_category_id.nextval, 'some title');
Để thực hiện việc này một cách tự động, chẳng hạn như AUTO_INCREMENT, hãy sử dụng trình kích hoạt trước khi chèn:
-- Automatically create the incremented ID for every row:
CREATE OR REPLACE trigger bi_category_id
BEFORE INSERT ON category
FOR EACH ROW
BEGIN
SELECT seq_category_id.nextval INTO :new.id FROM dual;
END;
Hoặc:
-- Allow the user to pass in an ID to be used instead
CREATE OR REPLACE TRIGGER bi_category_id
BEFORE INSERT ON category
FOR EACH ROW
DECLARE
v_max_cur_id NUMBER;
v_current_seq NUMBER;
BEGIN
IF :new.id IS NULL THEN
SELECT seq_category_id.nextval INTO :new.id FROM dual;
ELSE
SELECT greatest(nvl(max(id),0), :new.id) INTO v_max_cur_id FROM category;
SELECT seq_category_id.nextval INTO v_current_seq FROM dual;
WHILE v_current_seq < v_max_cur_id
LOOP
SELECT seq_category_id.nextval INTO v_current_seq FROM dual;
END LOOP;
END IF;
END;
Bây giờ, khi phát hiện ra những điểm khác biệt này, bạn thường có thể chỉ cần tìm kiếm một cái gì đó như "danh tính oracle" hoặc "oracle auto_increment" để xem Oracle thực hiện điều này như thế nào.