2015-11-02 2 views
0

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

Так ниже таблица -

create table t1 (aa varchar2(10),bb varchar2(10),cc varchar2(10),dd varchar2(10),ee varchar2(10)); 


insert into T1 values ('a','b','c','x','y'); 
insert into T1 values ('d','e','f','u','w'); 
insert into T1 values ('g','h','i','q','r'); 
insert into t1 values ('j','k','l','v','z'); 


alter table T1 add constraint T1_U unique (AA,BB); 


alter table T1 add constraint T1_U1 unique (cc,dd); 

Теперь у нас есть 2 ограничений и из тех, что я хотел, чтобы удалить T1_U1 и изменить T1_U.

2 ограничения можно увидеть via--

SELECT * FROM USER_OBJECTS WHERE OBJECT_NAME IN ('T1_U','T1_U1'); 

Теперь ниже шаги, которые я после

  1. Отключить T1_U constraint--

    ALTER TABLE T1 DISABLE CONSTRAINT T1_U;

  2. Индекс переименования -

    ALTER INDEX T1_U1 RENAME TO T1_U;

  3. Отбрасывание T1_U.

    ALTER TABLE T1 DROP CONSTRAINT T1_U;

Теперь, вот если я проверить USER_OBJECTS еще я могу увидеть T1_U. - Почему это так?

Так что я пытался использовать DROP INDEX T1_U; - это неправильное.

  1. Затем я попытался изменить T1_U - который получил неудачу, как ожидалось.

Вопрос: не могли бы вы сообщить мне, есть ли способ, которым мы можем достичь выше?

Спасибо.

ответ

1

Это легко объяснить, если вы посмотрите на user_constraints:

create table t1 (aa varchar2(10),bb varchar2(10),cc varchar2(10),dd varchar2(10),ee varchar2(10)); 

insert into T1 values ('a','b','c','x','y'); 
insert into T1 values ('d','e','f','u','w'); 
insert into T1 values ('g','h','i','q','r'); 
insert into t1 values ('j','k','l','v','z'); 

alter table T1 add constraint T1_U unique (AA,BB); 
alter table T1 add constraint T1_U1 unique (cc,dd); 

SELECT object_name, object_type FROM USER_OBJECTS WHERE OBJECT_NAME IN ('T1_U','T1_U1'); 

OBJECT_NAME OBJECT_TYPE   
------------ ------------------- 
T1_U   INDEX    
T1_U1  INDEX 

select constraint_name, constraint_type, table_name, status, index_name from user_constraints where constraint_name IN ('T1_U','T1_U1'); 

CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME STATUS INDEX_NAME 
---------------- --------------- ----------- -------- ----------- 
T1_U    U    T1   ENABLED T1_U 
T1_U1   U    T1   ENABLED T1_U1 

Ограничения присутствуют наряду с их соответствующими индексами.

ALTER TABLE T1 DISABLE CONSTRAINT T1_U; 

SELECT object_name, object_type FROM USER_OBJECTS WHERE OBJECT_NAME IN ('T1_U','T1_U1'); 

OBJECT_NAME OBJECT_TYPE   
------------ ------------------- 
T1_U1  INDEX 

select constraint_name, constraint_type, table_name, status, index_name from user_constraints where constraint_name IN ('T1_U','T1_U1'); 

CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME STATUS INDEX_NAME 
---------------- --------------- ----------- -------- ----------- 
T1_U1   U    T1   ENABLED T1_U1  
T1_U    U    T1   DISABLED 

Теперь ограничение T1_U не отключается, а индекс T1_U, который был соблюдение индекса теперь больше не требуется, и - потому что Oracle знает, что ограничение было создано ограничение, а не отдельно (я не уверен, как это сделать, но это так) - он знает, что индекс больше не требуется, поэтому его можно отбросить. (Вы можете подтвердить это путем создания индекса первого до создания ограничений, а когда ограничение отключено, индекс по-прежнему есть.)

ALTER INDEX T1_U1 RENAME TO T1_U; 

SELECT object_name, object_type FROM USER_OBJECTS WHERE OBJECT_NAME IN ('T1_U','T1_U1'); 

OBJECT_NAME OBJECT_TYPE   
------------ ------------------- 
T1_U   INDEX 

select constraint_name, constraint_type, table_name, status, index_name from user_constraints where constraint_name IN ('T1_U','T1_U1'); 

CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME STATUS INDEX_NAME 
---------------- --------------- ----------- -------- ----------- 
T1_U1   U    T1   ENABLED T1_U  
T1_U    U    T1   DISABLED 

Потому что нет индекса T1_U больше, мы можем переименовать индекс T1_U1 до T1_U. Обратите внимание, однако, что это не влияет на ограничение, с которым оно связано - оно все еще принадлежит ограничению T1_U1.

ALTER TABLE T1 DROP CONSTRAINT T1_U; 

SELECT object_name, object_type FROM USER_OBJECTS WHERE OBJECT_NAME IN ('T1_U','T1_U1'); 

OBJECT_NAME OBJECT_TYPE   
------------ ------------------- 
T1_U   INDEX  

select constraint_name, constraint_type, table_name, status, index_name from user_constraints where constraint_name IN ('T1_U','T1_U1'); 

CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME STATUS INDEX_NAME 
---------------- --------------- ----------- -------- ----------- 
T1_U1   U    T1   ENABLED T1_U 

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

Кроме того, если вы пытались сделать сейчас:

drop index t1_u; 

вы получите:

ORA-02429: не может удалить индекс, используемый для исполнения уникального/первичного ключа

Надеюсь, это очистит вас от вашего первого вопроса.

Для вашего второго вопроса - «можете ли вы, пожалуйста, сообщить мне, есть ли способ, которым мы можем достичь выше?» это зависит именно от того, что вы пытаетесь сделать. Hopefuly мое объяснение выше позволило вам разобраться в том, что происходит в вашем примере и почему, и позволило вам ответить на ваш собственный вопрос.

Если у вас нет, уточните свой вопрос с дополнительной информацией о том, чего вы пытаетесь достичь.

Смежные вопросы