[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 : 신원 열
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.여기에 대신 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 );
from https://stackoverflow.com/questions/28523262/multiple-insert-sql-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 사용 LEFT 조인 할 때 어떻게이 스크립트는 테이블을 갱신한다? (0) | 2020.07.12 |
---|---|
[SQL] , 허용 널 (null)을 하나 개의 테이블에있는 모든 항목을 선택하고 다른 테이블과 조인 (0) | 2020.07.12 |
[SQL] MySQL의에서 선택 동적 열 (0) | 2020.07.12 |
[SQL] SQL 서버 2008 크로스 탭 쿼리 (0) | 2020.07.12 |
[SQL] mysql을 - 열 성능 대 만들기 행 (0) | 2020.07.11 |