Podczas testowania niektórych skryptów migracji z kopią danych produkcyjnych (skrypty działają poprawnie z danymi programistycznymi) znalazłem ciekawą sytuację. CONSTRAINT zmieniło się, dlatego wydajemy polecenia DROP + ADD:
ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;
ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
CONTROL_ID,
CALLE_AYTO_DUPL
)
ENABLE;
Polecenie DROP działało dobrze, ale polecenie DODAJ nie powiodło się. Teraz jestem w błędnym kole. Nie mogę usunąć ograniczenia, ponieważ nie istnieje (początkowe upuszczenie działało zgodnie z oczekiwaniami):
ORA-02443: Nie można usunąć ograniczenia - nieistniejące ograniczenie
Nie mogę go utworzyć, ponieważ nazwa już istnieje:
ORA-00955: nazwa jest już używana przez istniejący obiekt
Piszę A_DUP_CALLE_UK1
w polu wyszukiwania dewelopera SQL i ... gotowe! Właściciel, nazwa tabeli, Tablescape ... wszystko mecze: nie jest inny obiekt o tej samej nazwie, to jest mój oryginalny ograniczenie. Tabela pojawia się w szczegółach ograniczenia, ale ograniczenie nie pojawia się w szczegółach tabeli.
Moje pytania:
- Jakie jest tego wytłumaczenie?
- Jak mogę się upewnić, że tak się nie stanie, gdy dokonam prawdziwej aktualizacji na serwerze na żywo?
(Serwer to 10 g XE, nie mam wystarczającej reputacji, aby utworzyć tag).
źródło
Odpowiedzi:
Domyślam się, że Marian ma rację, a jest to spowodowane unikalnym indeksem i ograniczeniem o tej samej nazwie, np .:
Zwykle po dodaniu unikalnego ograniczenia tworzony jest unikalny indeks o tej samej nazwie - ale indeks i ograniczenie nie są tym samym. Sprawdź,
all_indexes
czy istnieje wywoływany indeksA_DUP_CALLE_UK1
i spróbuj dowiedzieć się, czy jest on używany przez coś innego, zanim go upuścisz!źródło
exp
polecenie zawieraCREATE UNIQUE INDEX "A_DUP_CALLE_UK1" ...
instrukcję, której nie ma w oryginalnym zestawie skryptów.Wydaje się bardzo dziwne.
Możesz uruchomić:
aby sprawdzić, czy na jaki obiekt narzeka Oracle. Następnie możesz uruchomić w tym celu odpowiednią instrukcję DROP.
Jedyną rzeczą, o której mogę myśleć, jest całkowite upuszczenie stołu,
DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS
aby pozbyć się wszystkiego, co należy do tego stołu, a następnie odtworzenie go całkowicie.Jeśli tabela zawiera wartościowe dane, możesz wykonać ich kopię zapasową przed:
Po odtworzeniu tabeli możesz to zrobić
przywrócić dane.
źródło
Kilka minut temu miałem ten sam problem ... i znalazłem wyjaśnienie.
Tworząc klucz podstawowy, Oracle tworzy dwa obiekty: ograniczenie i indeks, który kontroluje część „UNIQUE”.
Po usunięciu ograniczenia indeks pozostaje tam, używając tej samej nazwy indeksu, więc jeśli wykonasz tylko
Zrzucisz tylko ograniczenie. Aby usunąć indeks, musisz wykonać
To powinno wystarczyć. Alternatywnie możesz wykonać obie te komendy jednocześnie z komendą
źródło
Ograniczenia klucza podstawowego pochodzą z indeksem. Upuszczasz ograniczenie, ale nie indeksujesz. Czek:
i widzisz, że
OBJECT_TYPE
jestINDEX
.Więc wykonaj oba:
źródło
Zrób to
To będzie działać.
WIZERUNEK:
źródło
ALTER TABLE A_DUP_CALLE DROP CONSTRAINT A_DUP_CALLE_UK1;
Relationship142
a inneNOT NULL
Ograniczenie zostało nazwaneSYS_C0015910
. Tak więcSYS_C0015910
został pomyślnie usunięty za pomocą prostego zapytania ALTER, aleRelationship142
potrzebował PODWÓJNYCH CYTATÓWalter table ... add constraint "Relationship143" ...
"Relationship143"
jest rzeczywiście inna nazwa niżRELATIONSHIP143
. Ale"RELATIONSHIP143"
iRELATIONSHIP143
są identyczne"Relationship143"
sama. Prawdopodobnie było to jedno z twoich narzędzi. W każdym razie: w obecnej formie Twoja odpowiedź jest po prostu błędna w kontekście pierwotnego pytania.