Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chèn nếu không tồn tại Oracle

Đến bữa tiệc muộn, nhưng ...

Với oracle 11.2.0.1, có một gợi ý về ngữ nghĩa có thể làm được điều này: IGNORE_ROW_ON_DUPKEY_INDEX

Ví dụ:

insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(customer_orders,pk_customer_orders) */
  into customer_orders
       (order_id, customer, product)
values (    1234,     9876,  'K598')
     ;

CẬP NHẬT :Mặc dù gợi ý này hoạt động (nếu bạn viết đúng chính tả), có những cách tiếp cận tốt hơn mà không yêu cầu Oracle 11R2:

Cách tiếp cận đầu tiên — bản dịch trực tiếp gợi ý ngữ nghĩa ở trên:

begin
  insert into customer_orders
         (order_id, customer, product)
  values (    1234,     9876,  'K698')
  ;
  commit;
exception
  when DUP_VAL_ON_INDEX
  then ROLLBACK;
end;

Lần tiếp cận thứ hai — một nhanh hơn cả hai gợi ý trên khi có nhiều tranh cãi:

begin
    select count (*)
    into   l_is_matching_row
    from   customer_orders
    where  order_id = 1234
    ;

    if (l_is_matching_row = 0)
    then
      insert into customer_orders
             (order_id, customer, product)
      values (    1234,     9876,  'K698')
      ;
      commit;
    end if;
exception
  when DUP_VAL_ON_INDEX
  then ROLLBACK;
end;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển danh sách các số nguyên từ C # vào quy trình được lưu trữ của Oracle

  2. Cổng PL / SQL trong R11i

  3. Oracle chọn bản ghi ngày gần đây nhất

  4. Tự động tăng dần cho Oracle

  5. không thể nhận tham số từ thủ tục oracle được thực thi bởi mybatis