Ne všechny SQL jsou stejné. Oracle ani MySQL nepodporují skutečný SQL standard IDENTITY.
Oracle nepoužívá zpětná označení... ve skutečnosti nemusíte uvádět své identifikátory. Raději ne, abyste neskončili neúmyslným použitím neplatného znaku v identifikátoru.
Čísla Oracle se nazývají NUMBER a mohou mít volitelnou přesnost a měřítko.
CREATE TABLE Category
(
id NUMBER(11) NOT NULL,
title VARCHAR2(45) NULL,
PRIMARY KEY (id)
)
Chcete-li provést AUTO_INCREMENT, vytvořte sekvenci:
CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;
Poté, když vložíte do tabulky, udělejte toto:
INSERT INTO category
VALUES (seq_category_id.nextval, 'some title');
Chcete-li to provést automaticky, například AUTO_INCREMENT, použijte spouštěč před vložením:
-- 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;
Nebo:
-- 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;
Nyní, pokud jde o objevování těchto rozdílů, často stačí vyhledat něco jako „oracle identity“ nebo „oracle auto_increment“, abyste viděli, jak to Oracle dělá.