Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Auto-Increment-Spalte:Unterschiede in der SQL-Syntax zwischen Oracle und MySQL

Nicht alle SQL sind gleich. Weder Oracle noch MySQL unterstützen den aktuellen SQL-Standard von IDENTITY.

Oracle verwendet keine Backticks ... Sie müssen Ihre Bezeichner nicht wirklich zitieren. Besser nicht, damit Sie nicht versehentlich ein ungültiges Zeichen in einer Kennung verwenden.

Oracle-Zahlen heißen NUMBER und können eine optionale Genauigkeit und Skalierung annehmen.

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

Erstellen Sie für ein AUTO_INCREMENT eine Sequenz:

CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;

Wenn Sie dann in die Tabelle einfügen, tun Sie dies:

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

Um dies automatisch zu tun, verwenden Sie wie AUTO_INCREMENT einen Before-Insert-Trigger:

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

Oder:

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

Nun, um diese Unterschiede zu entdecken, können Sie oft einfach nach etwas wie "oracle identity" oder "oracle auto_increment" suchen, um zu sehen, wie Oracle dies tut.