Mysql
 sql >> Base de données >  >> RDS >> Mysql

Colonne d'auto-incrémentation :différences de syntaxe SQL entre Oracle et MySQL

Tous les SQL ne sont pas identiques. Ni Oracle ni MySQL ne prennent en charge le standard SQL actuel d'IDENTITY.

Oracle n'utilise pas de backticks... vous n'avez pas besoin de citer vos identifiants. Mieux vaut ne pas le faire pour ne pas utiliser par inadvertance un caractère invalide dans un identifiant.

Les valeurs numériques Oracle sont appelées NUMBER et peuvent prendre une précision et une échelle facultatives.

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

Pour faire un AUTO_INCREMENT, créez une séquence :

CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;

Ensuite, lorsque vous insérez dans le tableau, procédez comme suit :

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

Pour le faire automatiquement, comme AUTO_INCREMENT, utilisez un déclencheur avant insertion :

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

Maintenant, en ce qui concerne la découverte de ces différences, vous pouvez souvent simplement rechercher quelque chose comme "oracle identity" ou "oracle auto_increment" pour voir comment Oracle procède.