sql >> Base de Datos >  >> RDS >> Mysql

Columna de incremento automático:diferencias en la sintaxis SQL entre Oracle y MySQL

No todos los SQL son iguales. Ni Oracle ni MySQL son compatibles con el estándar SQL actual de IDENTIDAD.

Oracle no usa acentos graves... en realidad no necesita citar sus identificadores. Es mejor no hacerlo para no terminar usando sin darse cuenta un carácter no válido en un identificador.

Los valores numéricos de Oracle se denominan NÚMERO y pueden adoptar una precisión y una escala opcionales.

CREATE TABLE Category
(
  id    NUMBER(11)   NOT NULL,
  title VARCHAR2(45) NULL,
  PRIMARY KEY (id)
)

Para hacer un AUTO_INCREMENTO, crea una secuencia:

CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;

Luego, cuando insertes en la tabla, haz esto:

INSERT INTO category
VALUES (seq_category_id.nextval, 'some title');

Para hacer esto automáticamente, como AUTO_INCREMENT, use un disparador antes de insertar:

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

O:

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

Ahora, en cuanto a descubrir estas diferencias, a menudo puede buscar algo como "identidad de Oracle" o "auto_incremento de Oracle" para ver cómo Oracle hace esto.