Oracle
 sql >> база данни >  >> RDS >> Oracle

Изключение за нарушение на ограничение ORA-00001

уникално ограничение налага, добре, уникалност. Той ще позволи нули, за разлика от ограничение за първичен ключ .

Вашата грешка означава, че вмъквате дублиращи се данни, когато базата данни е конфигурирана изрично да забранява това.

Можете да разберете какви ограничения има върху таблица, като изпълните следната заявка на всички_ограничения . Връзката декодира колоната CONSTRAINT_TYPE , например P е първичен ключ и U уникален ключ.

select *
  from all_constraints uc
 where uc.table_name = 'MY_TABLE'
   and owner = 'DBSCHEMA'

За да разберете какви колони има в ограничение, използвайте all_cons_columns вместо това или комбиниране на двете в една заявка:

select uc.*, ucc.column_name, ucc.position
  from all_constraints uc
  join all_cons_columns ucc
    on uc.owner = ucc.owner
   and uc.table_name = ucc.table_name
   and uc.constraint_name = ucc.constraint_name
 where uc.table_name = 'MY_TABLE'
   and uc.owner = 'DBSCHEMA'

Към всяка заявка можете да добавите допълнителното условие and constraint_name = 'IDX_CO_DETAILS' за да разберете подробности за конкретното ограничение, което изглежда причинява проблема ви.

Вашият коментар е малко изненадващ поради няколко причини. Дори ограничение, създадено от системата, например такова, което е дефинирано в ред при създаването на таблицата, без да е посочено име, трябва да се покаже. Освен това името на ограничението IDX... означава, че това е индекс.

АКО изпълните следната заявка, тя трябва да ви каже дали обектът съществува в базата данни:

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

Очаквам, че OBJECT_TYPE върнат от тази заявка е 'INDEX' .

Следвайки това, следната заявка ще върне всеки индекс с това име, типа на индекса, таблицата, с която е свързан, и собственика на тази таблица.

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

Съдейки по вашата грешка, бих очаквал допълнително, че колоната UNIQUNESS върнато от тази заявка е 'UNIQUE' .

Това трябва да ви помогне да проследите обекта.

Можете също да използвате системния пакет dbms_metadata за проследяване на DDL на обекта; внимавайте, че връща буца.

select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA') 
  from dual

параметърът schema не е задължително.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Spring Batch ORA-08177:не може да се сериализира достъпът за тази транзакция при изпълнение на едно задание, СЕРИАЛИЗИРАНО ниво на изолация

  2. Показване на съобщения в модалния прозорец във формуляри на Oracle с помощта на Show_Alert

  3. Java-Eclipse:Пакетът oracle.jdbc.driver не съществува

  4. OleDB Доставчик на данни не може да бъде намерен VBA/Excel

  5. Permgen Memory Leak с горещо повторно разполагане и база данни на Oracle