sql >> Databáze >  >> RDS >> Mysql

Sloupec automatického přírůstku:rozdíly v syntaxi SQL mezi Oracle a MySQL

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á.



  1. Resetovat pozici kurzoru v PDO

  2. Jak deklarovat interní tabulku v MySQL?

  3. Udržování seskupeného běhu MAX (nebo MIN)

  4. Jak zkontroluji nastavení InnoDB?