Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Coluna de incremento automático:diferenças na sintaxe SQL entre Oracle e MySQL


Nem todo SQL é igual. Nem Oracle nem MySQL suportam o padrão SQL real de IDENTITY.

Oracle não usa backticks... você não precisa citar seus identificadores. Melhor não para não acabar usando inadvertidamente um caractere inválido em um identificador.

Os números Oracle são chamados NUMBER e podem ter uma precisão e escala opcionais.
CREATE TABLE Category
(
  id    NUMBER(11)   NOT NULL,
  title VARCHAR2(45) NULL,
  PRIMARY KEY (id)
)

Para fazer um AUTO_INCREMENT, crie uma sequência:
CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;

Então, quando você inserir na tabela, faça isso:
INSERT INTO category
VALUES (seq_category_id.nextval, 'some title');

Para fazer isso automaticamente, como AUTO_INCREMENT, use um gatilho antes de inserir:
-- 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;

Ou:
-- 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;

Agora, no que diz respeito a descobrir essas diferenças, muitas vezes você pode apenas procurar algo como "identidade do oráculo" ou "auto_incremento do oráculo" para ver como o Oracle faz isso.