Cenário:
- A tabela
MY_TABLE
tem restrição de chave primáriaPK_MY_TABLE
- A tabela
MY_TABLE
também possui um índice chamadoIDX_PK_MY_TABLE
que reforça a exclusividade da restriçãoPK_MY_TABLE
.
Se eu desativar a restrição PK_MY_TABLE
e, em seguida, habilitá-la novamente, o índice será IDX_PK_MY_TABLE
reconstruído?
É facilmente testado.
Existem dois cenários possíveis.
Cenário 1:
Cenário 1 é a criação de um PK usando um índice existente:
Adicione o índice a ele:
Adicione a restrição:
Insira alguns dados:
Teste a restrição:
Desabilite a restrição:
Tente
INSERT
novamente:É bem-sucedido porque o índice exclusivo não foi desabilitado/descartado quando a restrição foi desabilitada. Observe que o erro original era
ORA-00001: unique constraint (PHIL.PK_MY_TABLE) violated
, enquanto a restrição de índicePHIL.IDX_PK_MY_TABLE
é violada quando a restrição PK é desativada.Cenário 2:
Cenário 2 é a criação do PK na criação da tabela:
Desabilite a restrição:
O índice sumiu!:
Reabilitá-lo recria o índice:
Se você quiser manter o índice:
Depende de como você desabilita a restrição.
O acima descarta o índice, portanto, quando você habilitar a restrição, o índice será reconstruído. O abaixo preserva o índice:
Se você desabilitar a restrição dessa forma, o índice permanecerá utilizável e não haverá necessidade de reconstruí-lo ao reabilitar a restrição.
A menos que eu perca alguma coisa, o comportamento de descartar o índice junto com a desativação da restrição depende de como o índice é criado e se é exclusivo.
1. O índice exclusivo criado ao mesmo tempo que a restrição será descartado quando a restrição for desativada, a menos que
KEEP INDEX
seja usadoSe existir um índice exclusivo antes da criação da restrição, ele será mantido, a menos que
DROP INDEX
seja usado.CREATE TABLE table1(table1_id INT NOT NULL ); CREATE INDEX IDXU_TABLE1_ID ON TABLE1(table1_id); ALTER TABLE table1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY(table1_id) USING INDEX IDXU_TABLE1_ID;
Se a restrição exclusiva for suportada pelo índice não exclusivo, o índice será mantido, a menos que
DROP INDEX
seja usado. Por exemploCREATE TABLE table1(table1_id INT NOT NULL, CONSTRAINT PK_TABLE1 PRIMARY KEY(table1_id) USING INDEX (CREATE INDEX IDX_TABLE1_ID ON TABLE1(table1_id))) ;