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

Ràng buộc duy nhất ORA-00001 bị vi phạm

ORA-00001 giới hạn duy nhất bị vi phạm là một trong những thông báo phổ biến mà chúng tôi thường nhận được khi tải dữ liệu.

Lỗi vi phạm ràng buộc duy nhất ORA-00001 này xảy ra khi Bạn cố gắng thực thi một câu lệnh INSERT hoặc UPDATE đã tạo ra một giá trị trùng lặp trong một trường bị hạn chế bởi một chỉ mục duy nhất.

Danh sách kiểm tra để chạy để giải quyết ORA-00001

Chúng tôi có thể thực hiện các mục hành động sau cho ORA-00001 này

(1) Bạn có thể xem lỗi và tìm thông tin ràng buộc với sql bên dưới

SELECT column_name, position
FROM all_cons_columns
WHERE constraint_name = '<name of the constraint in error>'
AND owner = '<table owner>'
AND table_name = '<table name>'

Bây giờ chúng tôi có thể kiểm tra dữ liệu hiện có với dữ liệu chúng tôi đang chèn và sau đó thực hiện hành động tương ứng. Bạn có thể thay đổi các phím để có thể lắp chúng vào

CREATE TABLE EXAMPLE_UNIQ(
EXAM_ID NUMBER NOT NULL ENABLE,
EXAM_NAME VARCHAR2(250) NOT NULL ENABLE
CONSTRAINT UK1_EXAMPLE UNIQUE (EXAM_ID, EXAM_NAME) ENABLE
);
table created.

INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1000, 'XYZ');
1 rows inserted.
Commit;

INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1000, 'XYZ');
SQL Error: ORA-00001: unique constraint (UK1_EXAMPLE) violated
Solution
INSERT INTO EXAMPLE_UNIQ (EXAM_ID, EXAM_NAME) VALUES (1001, 'XYZ');
1 rows inserted.

(2) Chúng tôi có thể bỏ ràng buộc nếu cho phép các bản sao trong bảng

Ví dụ

alter table <table name> drop constraint <constraint name>;

(3) Gợi ý 11gr2 allow_row_on_dupkey_index cho phép câu lệnh bỏ qua các lỗi ORA-00001 một cách im lặng.

  • Gợi ý IGNORE_ROW_ON_DUPKEY_INDEX không giống như các gợi ý khác ở chỗ chúng có tác dụng về ngữ nghĩa. Triết lý chung được giải thích trong "Gợi ý" không áp dụng cho ba gợi ý này.
  • Gợi ý IGNORE_ROW_ON_DUPKEY_INDEX chỉ áp dụng cho các thao tác INSERT trong một bảng. Nó không được hỗ trợ cho các hoạt động CẬP NHẬT, XÓA, MERGE hoặc chèn nhiều bảng. IGNORE_ROW_ON_DUPKEY_INDEX khiến câu lệnh bỏ qua lỗi vi phạm khóa duy nhất đối với một tập hợp cột được chỉ định hoặc đối với một chỉ mục được chỉ định. Khi gặp phải vi phạm khóa duy nhất, quá trình khôi phục cấp hàng sẽ xảy ra và quá trình thực thi tiếp tục với hàng đầu vào tiếp theo. Nếu bạn chỉ định gợi ý này khi chèn dữ liệu có bật ghi nhật ký lỗi DML, thì lỗi vi phạm khóa duy nhất sẽ không được ghi lại và không gây ra kết thúc câu lệnh.

Hiệu ứng ngữ nghĩa của gợi ý này dẫn đến thông báo lỗi nếu các quy tắc cụ thể bị vi phạm:

  • Nếu bạn chỉ định chỉ mục, thì chỉ mục đó phải tồn tại và là duy nhất. Nếu không, câu lệnh gây ra ORA-38913.
  • Bạn phải chỉ định chính xác một chỉ mục. Nếu bạn chỉ định không có chỉ mục, thì câu lệnh gây ra ORA-38912. Nếu bạn chỉ định nhiều hơn một chỉ mục, thì câu lệnh sẽ gây ra ORA-38915.
  • Bạn có thể chỉ định một gợi ý CHANGE_DUPKEY_ERROR_INDEX hoặc IGNORE_ROW_ON_DUPKEY_INDEX trong một câu lệnh INSERT, nhưng không phải cả hai. Nếu bạn chỉ định cả hai, thì câu lệnh gây ra ORA-38915.
  • Như với tất cả các gợi ý, một lỗi cú pháp trong gợi ý khiến nó bị bỏ qua một cách im lặng. Kết quả là ORA-00001 sẽ được tạo ra, giống như khi không có gợi ý nào được sử dụng.
insert /*+ ignore_row_on_dupkey_index(unique_table, unique_table_idx) */
into
unique_table
(select * from non_unique_table);

Các bài viết có liên quan

ORA-00911:ký tự không hợp lệ
ORA-03113:cuối tệp trên kênh liên lạc
ORA-00257
ORA-29285:lỗi ghi tệp
ORA-29913 với bảng bên ngoài
xóa truy vấn trong oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e0.htm


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cuộn lại A nếu B sai. khởi động mùa xuân, jdbctemplate

  2. Cách thực thi chức năng trong Oracle với các tham số

  3. Oracle Entity Framework - Tạo thực thể từ các bảng trong các lược đồ khác nhau

  4. Làm cách nào để bạn thiết lập một máy chủ được liên kết với cơ sở dữ liệu Oracle trên SQL 2000/2005?

  5. Làm thế nào để lưu BLOB dưới dạng tệp trong PL / SQL?