복붙노트

[SQL] 여러 삽입 SQL 오라클

SQL

여러 삽입 SQL 오라클

당신은 ID 열이있을 때 어떻게 오라클 12C에서 SQL 여러 삽입을해야합니까?

INSERT ALL
INTO Table1 (Column2) Values (1)
INTO Table1 (Column2) Values (2)
SELECT * FROM dual;

표 1은 ID로 컬럼 1을 갖는 경우, 기본 키 제약을 위반 동일한 값을 갖도록 ID 열을 설정할 것이다.

CREATE TABLE Table1 (
  Table1Id NUMBER GENERATED ALWAYS AS IDENTITY,
  column2 VARCHAR2(255),
  column3 NUMBER,
  PRIMARY KEY (Table1Id)
);

INSERT ALL
  INTO Table1 (column2, column3) VALUES ('a', '1')
  INTO Table1 (column2, column3) VALUES ('b', '2')
SELECT * FROM dual;

--SQL Error: ORA-00001: unique constraint violated

나는 무엇이 잘못을하고있는 중이 야?

해결법

  1. ==============================

    1.편집 추가 된 두 개의 테스트 케이스 및 가능한 해결 방법.

    편집 추가 된 두 개의 테스트 케이스 및 가능한 해결 방법.

    삽입 문하지만 모든 문 삽입 실제적으로 같은 기존의 삽입 문입니다. 이 시퀀스에 올 때, 그들은 다르게 작동합니다.

    테스트 케이스 1 : 신원 열

    SQL> DROP TABLE table1 PURGE;
    
    Table dropped.
    
    SQL>
    SQL> CREATE TABLE Table1 (
      2    Table1Id NUMBER GENERATED ALWAYS AS IDENTITY,
      3    column3 NUMBER,
      4    PRIMARY KEY (Table1Id)
      5  );
    
    Table created.
    
    SQL>
    SQL> INSERT ALL
      2    INTO Table1 (column3) VALUES ('1')
      3    INTO Table1 (column3) VALUES ('2')
      4  SELECT * FROM dual;
    INSERT ALL
    *
    ERROR at line 1:
    ORA-00001: unique constraint (LALIT.SYS_C0010439) violated
    
    
    SQL>
    

    의 실제로 후드 아래에 무슨 일이 일어나고 있는지 보자 -

    SQL> CREATE TABLE Table1 (
      2    Table1Id NUMBER GENERATED ALWAYS AS IDENTITY,
      3    column3 NUMBER,
      4    CONSTRAINT A UNIQUE (Table1Id)
      5  );
    
    Table created.
    
    SQL> INSERT ALL
      2    INTO Table1 (column3) VALUES (1)
      3    INTO Table1 (column3) VALUES (2)
      4  SELECT * FROM dual;
    INSERT ALL
    *
    ERROR at line 1:
    ORA-00001: unique constraint (LALIT.A) violated
    
    
    SQL> SELECT * FROM table1;
    
    no rows selected
    
    SQL> ALTER TABLE table1
      2  DISABLE CONSTRAINT a;
    
    Table altered.
    
    SQL> INSERT ALL
      2    INTO Table1 (column3) VALUES (1)
      3    INTO Table1 (column3) VALUES (2)
      4  SELECT * FROM dual;
    
    2 rows created.
    
    SQL> SELECT * FROM table1;
    
      TABLE1ID    COLUMN3
    ---------- ----------
             2          1
             2          2
    
    SQL>
    

    그래서, 순서는 그러나 고유 제약 조건 위반에게 우리가 모두 삽입 한 처음이 있었다 NEXTVAL을 진행. 다음으로, 우리는 고유 제한 조건을 비활성화하고, 이후의 삽입 모든 순서가 아니라, NEXTVAL에 진행하지 않았다가 중복 키를 삽입하려고 시도 것을 알 수있다.

    문제는 INSERT-INTO-SELECT 문으로 발생하지 않지만.

    SQL> INSERT INTO table1(column3) SELECT LEVEL FROM dual CONNECT BY LEVEL <=5;
    
    5 rows created.
    
    SQL>
    SQL> SELECT * FROM table1;
    
      TABLE1ID    COLUMN3
    ---------- ----------
             2          1
             3          2
             4          3
             5          4
             6          5
    
    SQL>
    

    놀랍게도, 메타 데이터에 따라, 순서는 그러나 그것이 삽입 모든 문을 발생하지 않습니다, 자동으로 NEXTVAL로 진행 예정이다.

    SQL> SELECT COLUMN_NAME,
      2    IDENTITY_COLUMN,
      3    DATA_DEFAULT
      4  FROM user_tab_cols
      5  WHERE table_name   ='TABLE1'
      6  AND IDENTITY_COLUMN='YES';
    
    COLUMN_NAME     IDENTITY_COLUMN DATA_DEFAULT
    --------------- --------------- ------------------------------
    TABLE1ID        YES             "LALIT"."ISEQ$$_94458".nextval
    
    SQL>
    

    테스트 케이스 2 : 명시 적으로 순서를 사용하여

    삽입 ALL은 ID 열 사용 또는 명시 적 순서가 사용되는지 여부를 같은 방식으로 작동합니다.

    SQL> DROP SEQUENCE s;
    
    Sequence dropped.
    
    SQL>
    SQL> CREATE SEQUENCE s;
    
    Sequence created.
    
    SQL>
    SQL> DROP TABLE t PURGE;
    
    Table dropped.
    
    SQL>
    SQL> CREATE TABLE t (
      2    ID NUMBER,
      3    text VARCHAR2(50),
      4    CONSTRAINT id_pk PRIMARY KEY (ID)
      5  );
    
    Table created.
    
    SQL>
    SQL> INSERT ALL
      2    INTO t VALUES (s.nextval, 'a')
      3    INTO t VALUES (s.nextval, 'b')
      4    INTO t VALUES (s.nextval, 'c')
      5    INTO t VALUES (s.nextval, 'd')
      6  SELECT * FROM dual;
    INSERT ALL
    *
    ERROR at line 1:
    ORA-00001: unique constraint (LALIT.ID_PK) violated
    
    
    SQL>
    SQL> SELECT * FROM T;
    
    no rows selected
    
    SQL>
    SQL> ALTER TABLE t
      2    DISABLE CONSTRAINT id_pk;
    
    Table altered.
    
    SQL> INSERT ALL
      2    INTO t VALUES (s.nextval, 'a')
      3    INTO t VALUES (s.nextval, 'b')
      4    INTO t VALUES (s.nextval, 'c')
      5    INTO t VALUES (s.nextval, 'd')
      6  SELECT * FROM dual;
    
    4 rows created.
    
    SQL> SELECT * FROM T;
    
            ID TEXT
    ---------- ----------------------------------------
             2 a
             2 b
             2 c
             2 d
    
    SQL>
    

    가능한 해결 방법 - 행 레벨 트리거를 사용하여

    SQL> CREATE OR REPLACE TRIGGER t_trg
      2      BEFORE INSERT ON t
      3      FOR EACH ROW
      4      WHEN (new.id IS NULL)
      5      BEGIN
      6        SELECT s.NEXTVAL
      7        INTO   :new.id
      8        FROM   dual;
      9      END;
     10  /
    
    Trigger created.
    
    SQL> truncate table t;
    
    Table truncated.
    
    SQL> INSERT ALL
      2    INTO t (text) VALUES ('a')
      3    INTO t (text) VALUES ('b')
      4    INTO t (text) VALUES ('c')
      5    INTO t (text) VALUES ('d')
      6  SELECT * FROM dual;
    
    4 rows created.
    
    SQL> SELECT * FROM t;
    
            ID TEXT
    ---------- -------------------------
             3 a
             4 b
             5 c
             6 d
    
    SQL>
    
  2. ==============================

    2.여기에 대신 INSERT ALL 방법의 UNION ALL 방법을 사용하여 해결 방법입니다. 어떤 이유로 데이터가 (...)에서 선택 *에 싸여해야하거나 오류 ORA-01400를 생성합니다 수 없습니다 ( "JHELLER" "TABLE1" "TABLE1ID"..)에 NULL 삽입합니다.

    여기에 대신 INSERT ALL 방법의 UNION ALL 방법을 사용하여 해결 방법입니다. 어떤 이유로 데이터가 (...)에서 선택 *에 싸여해야하거나 오류 ORA-01400를 생성합니다 수 없습니다 ( "JHELLER" "TABLE1" "TABLE1ID"..)에 NULL 삽입합니다.

    insert into table1(column2, column3)
    select *
    from
    (
        select 'a', '1' from dual union all
        select 'b', '2' from dual
    );
    
  3. from https://stackoverflow.com/questions/28523262/multiple-insert-sql-oracle by cc-by-sa and MIT license