Ошибка уникального ограничения Oracle при вставке

INSERT INTO SS_ALERT_EVENTS (  ALERT_ID, EVENT_ID, TIME_DURATION, ALERT_EVENT_EFFECT, DATASET_ASSIGN_RULE, KEY_FIELDS_ASSIGN_RULE, SIDE, ALERT_VALIDATION_RULE, UNIQUE_ID ) VALUES ( 'test1', 7 ,  0, 1 ,  NULL,  '5b414c4552545f494e535452554d454e542e496e737472756d656e742049445d203a3d205b54524144455f5245504f52542e496e737472756d656e742049445d3b',  -1,  '5b414c4552542e416374696f6e5d203a3d20313b', 1)
*
ERROR at line 1:
ORA-00001: unique constraint (ESV31SURV.PK_SS_ALERT_EVENTS) violated

Поле EVENT_ID является проблемой. Но я все равно хочу его вставить. Однако, когда я пытаюсь удалить ограничение этого имени, он говорит, что такого ограничения нет. Кроме того, такое ограничение не отображается в таблице USER_CONSTRAINTS. Что я должен делать?


person nakiya    schedule 05.03.2011    source источник
comment
Если вы не видите объект, это не значит, что он не существует — это просто означает, что он был создан из другой схемы. Войдите как sys и снова просмотрите список ограничений.   -  person zerkms    schedule 05.03.2011


Ответы (1)


Уникальное ограничение на самом деле может быть ограничением первичного ключа - по крайней мере, это то, что следует из названия.

Удаление первичного ключа таблицы потенциально может иметь очень плохой побочный эффект, оно может нарушить работу приложений, которые полагаются на этот первичный ключ (и вам также придется удалить все внешние ключи, которые ссылаются на эту таблицу, прежде чем вы сможете удалить первичный ключ)

Этот первичный ключ был создан с какой-то целью, поэтому, прежде чем слепо отбрасывать его, вы должны проконсультироваться с тем, кто создал эту схему, и убедиться, что первичный ключ не нужен (или должен быть переопределен).

Сказав все это: попробуйте сбросить ПК, используя

ALTER TABLE SS_ALERT_EVENTS 
  DROP PRIMARY KEY

Но, пожалуйста, проверьте еще раз, действительно ли это мудрое решение!

person a_horse_with_no_name    schedule 05.03.2011
comment
Ограничение уникальности на самом деле является ограничением первичного ключа — по крайней мере, так следует из названия. --- неправильный. Посмотрите еще раз на запрос. Это не первичный ключ, это обычное уникальное ограничение. - person zerkms; 05.03.2011
comment
@zerkms: первичный ключ является уникальным ограничением. Нарушение ограничения PK вызовет ORA-0001 так же, как и нарушение обычного уникального ограничения. Попробуйте, оба выдают одну и ту же ошибку - person a_horse_with_no_name; 05.03.2011
comment
извините, мне нужны очки :-( По какой-то неизвестной причине я в первый раз не увидел, что имя ограничения ESV31SURV.PK_SS_ALERT_EVENTS содержит префикс PK. Извините. +1 - person zerkms; 05.03.2011
comment
@zerkms: ПК также является уникальным ограничением, тогда как уникальное ограничение не обязательно является ПК - здесь я с вами согласен. Но из сообщения об ошибке вы не можете сказать, является ли ограничение PK или просто уникальным ограничением. Еще раз: попробуйте. Оба выкинут ORA-0001. В соглашениях об именах, обычно используемых в мире Oracle, перед ограничением PK ставится префикс PK — вот почему я сказал это то, что следует из названия. I может быть обычным уникальным ограничением, но также может быть ограничением PK - person a_horse_with_no_name; 05.03.2011
comment
да, да, да, вы абсолютно правы. Я просто пропустил часть ограничения PK и подумал, что это обычный уникальный, извините еще раз ;-) Но из сообщения об ошибке --- конечно, я предложил посмотреть запрос, который содержит имя таблицы + имена полей и event_id, очевидно это плохое имя для таблицы с именем SS_ALERT_EVENTS. По крайней мере, с моей точки зрения. - person zerkms; 05.03.2011