sql >> データベース >  >> RDS >> Mysql

自動インクリメント列:OracleとMySQLのSQL構文の違い

    すべてのSQLが同じというわけではありません。 OracleもMySQLも、IDENTITYの実際のSQL標準をサポートしていません。

    Oracleはバッククォートを使用しません...実際に識別子を引用する必要はありません。識別子に無効な文字を誤って使用してしまうことがないようにしない方がよいでしょう。

    Oracleの数値はNUMBERと呼ばれ、オプションの精度とスケールを取ることができます。

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

    AUTO_INCREMENTを実行するには、シーケンスを作成します。

    CREATE SEQUENCE seq_category_id START WITH 1 INCREMENT BY 1;
    

    次に、テーブルに挿入するときに、次のようにします。

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

    AUTO_INCREMENTのようにこれを自動的に行うには、挿入前トリガーを使用します。

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

    または:

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

    さて、これらの違いを発見する限り、多くの場合、「oracleidentity」や「oracleauto_increment」などを検索して、Oracleがこれをどのように行うかを確認できます。



    1. データベース'/data/data/msv_database.db'の接続プールが接続を許可できませんでした。接続:0アクティブ、1アイドル、0使用可能

    2. myisamテーブルの代替の外部キー?

    3. PostgreSQLの単一引用符と二重引用符の違いは何ですか?

    4. 関数を呼び出す制約を確認するOracleSQLDeveloper