programing

MySQL INSERT IGNORE에 해당하는 Oracle?

bestprogram 2023. 6. 21. 22:49

MySQL INSERT IGNORE에 해당하는 Oracle?

삽입하기 전에 중복 항목이 없는지 확인하도록 쿼리를 업데이트해야 합니다.MySQL에서는 INSERT IGNORE를 사용하여 중복 레코드가 발견되면 삽입을 건너뛸 수 있지만 Oracle에 대한 동등한 옵션을 찾을 수 없습니다.좋은 의견이라도 있나?

11g에 있는 경우 힌트 IGNORE_ROW_ON_DUPKEY_INDEX를 사용할 수 있습니다.

SQL> create table my_table(a number, constraint my_table_pk primary key (a));

Table created.

SQL> insert /*+ ignore_row_on_dupkey_index(my_table, my_table_pk) */
  2  into my_table
  3  select 1 from dual
  4  union all
  5  select 1 from dual;

1 row created.

MERGE 문을 확인하십시오.이것은 당신이 원하는 것을 해야 합니다 - 그것은.WHEN NOT MATCHED이를 수행할 조항.

Oracle의 진정한 VALUES() 절에 대한 지원 부족에 대해 수행합니다. 고정된 값을 가진 단일 레코드에 대한 구문은 매우 서툴지만 다음과 같습니다.

MERGE INTO your_table yt
USING (
   SELECT 42 as the_pk_value, 
          'some_value' as some_column
   FROM dual
) t on (yt.pk = t.the_pke_value) 
WHEN NOT MATCHED THEN 
   INSERT (pk, the_column)
   VALUES (t.the_pk_value, t.some_column);

다른 접근 방식(예: 다른 테이블에서 대량 로드를 수행하는 경우)은 Oracle의 "오류 로깅" 기능을 사용하는 것입니다.이 문장은 다음과 같습니다.

 INSERT INTO your_table (col1, col2, col3)
 SELECT c1, c2, c3
 FROM staging_table
 LOG ERRORS INTO errlog ('some comment') REJECT LIMIT UNLIMITED;

나중에 오류가 발생한 모든 행을 테이블에서 사용할 수 있습니다.errlog생성해야 합니다.errlog를 사용하여 삽입을 실행하기 전에 수동으로 테이블(또는 선택한 이름)DBMS_ERRLOG.CREATE_ERROR_LOG.

자세한 내용은 설명서 참조

시간을 절약하기 위해 삽입을 시도하고 피할 수 없는 오류를 무시할 수 있습니다.

begin

   insert into table_a( col1, col2, col3 )
   values ( 1, 2, 3 );

   exception when dup_val_on_index then 
      null;

end;
/

이렇게 하면 중복 기본 키 또는 고유 키 제약 조건에 의해 특별히 제기된 예외만 무시되며, 다른 모든 항목은 정상적으로 상승됩니다.

이 작업을 수행하지 않으려면 먼저 표에서 선택해야 합니다. 이 작업은 그다지 효율적이지 않습니다.

또 다른 변종

Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid 
from person p, group g
where NOT EXISTS (select 1
                 from my_table a
                 where a.student_id = p.studentid
                 and a.group_id = g.groupid)

아니면 당신이 할 수 있습니다.

Insert into my_table (student_id, group_id)
select distinct p.studentid, g.groupid 
from person p, group g
MINUS
select student_id, group_id
from my_table 

간단한 해결책

insert into t1
  select from t2 
  where not exists 
    (select 1 from t1 where t1.id= t2.id)

이것은 내 것이 아니지만, 스클로더를 사용할 때 매우 유용하게 사용되었습니다.

  1. 테이블을 가리키는 보기를 만듭니다.

    CREATE OR REPLACE VIEW test_view
    AS SELECT * FROM test_tab
    
  2. 트리거 생성:

    CREATE OR REPLACE TRIGGER test_trig
     INSTEAD OF INSERT ON test_view
     FOR EACH ROW
      BEGIN
       INSERT INTO test_tab VALUES
        (:NEW.id, :NEW.name);
      EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN NULL;
      END test_trig;
    
  3. ctl 파일에서 대신 보기에 다음을 삽입합니다.

    OPTIONS(ERRORS=0)
    LOAD DATA
    INFILE 'file_with_duplicates.csv'
    INTO TABLE test_view
    FIELDS TERMINATED BY ','
    (id, field1)
    

중복을 확인해야 하는 필드가 있는 인덱스를 추가하고 고유해야 한다고 말하는 것은 어떻습니까?읽기 검사를 저장합니다.

또 다른 "존재하지 않는 곳"-이중...

insert into t1(id, unique_name)
  select t1_seq.nextval, 'Franz-Xaver' from dual 
    where not exists (select 1 from t1 where unique_name = 'Franz-Xaver');

언급URL : https://stackoverflow.com/questions/9332360/oracle-equivalent-to-mysql-insert-ignore