Jak mogę zrezygnować z ograniczenia "not null" w Oracle, jeśli nie znam jego nazwy?

Mam bazę danych, która ma nie NULL constraint na polu, i chcę usunąć to ograniczenie. Czynnikiem komplikującym jest to, że to ograniczenie ma nazwę zdefiniowaną przez system, a nazwa tego ograniczenia różni się między serwerem produkcyjnym, serwerem integracji i różnymi bazami danych programistów. Nasz obecny proces to sprawdzanie skryptów zmiany, a zautomatyzowane zadanie wykonuje odpowiednie zapytania przez sqlplus przeciwko docelowej bazie danych, więc wolałbym rozwiązanie, które można wysłać prosto do sqlplus.

W mojej własnej bazie danych, SQL do wyrzucenia to będzie:

alter table MYTABLE drop constraint SYS_C0044566

I can see the constraint when I query the all_constraints view:

select * from all_constraints where table_name = 'MYTABLE'

Ale nie jestem pewien, jak pracować z typem danych SEARCH_CONDITION S LONG lub jak najlepiej dynamicznie usunąć szukane ograniczenie, nawet po tym, jak znam jego nazwę.

Więc, jak mogę utworzyć skrypt zmiany, który może porzucić to ograniczenie na podstawie tego, co to jest, a nie Jaka jest jego nazwa jest?


Edytuj: @Allan ' s answer is a good one, but I am concern (in my brak wiedzy Oracle) that it may not be universal true that any constraint that might have a system-generated name will have associated with it a way to remove the constraint without to know its name. Czy to prawda, że zawsze będzie sposób, aby uniknąć konieczności znajomości nazwy ograniczenia o nazwie systemowej, gdy logicznie porzuci to ograniczenie?

Author: Chris Farmer, 2010-03-29

7 answers

alter table MYTABLE modify (MYCOLUMN null);

W Oracle ograniczenia not null są tworzone automatycznie, gdy nie podano null dla kolumny. Podobnie, są one automatycznie upuszczane, gdy kolumna jest zmieniana, aby zezwolić na null.

Wyjaśnienie zmienionego pytania: To rozwiązanie dotyczy tylko ograniczeń utworzonych dla kolumn "not null". Jeśli w definicji kolumny podasz "klucz podstawowy" lub ograniczenie wyboru bez nazywania, otrzymasz wygenerowaną przez system nazwę ograniczenia (i indeks, dla klucza głównego). W takich przypadkach, musisz znać nazwisko, żeby to upuścić. Najlepszą radą jest unikanie scenariusza, upewniając się, że podasz nazwę dla wszystkich ograniczeń innych niż "not null". Jeśli znajdziesz się w sytuacji, w której musisz ogólnie zrezygnować z jednego z tych ograniczeń, prawdopodobnie będziesz musiał uciekać się do PL/SQL i tabel definicji danych.

 171
Author: Allan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-29 19:43:01

Try:

alter table <your table> modify <column name> null;
 17
Author: vasanth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-27 21:51:53

Pamiętaj, że jeśli pole, które chcesz uczynić nullable, jest częścią klucza podstawowego, nie możesz. Klucze podstawowe nie mogą mieć pól null.

 1
Author: Mary C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 19:57:21

Aby odkryć stosowane ograniczenia, użyj poniższego kodu:

-- Set the long data type for display purposes to 500000.

SET LONG 500000

-- Define a session scope variable.

VARIABLE output CLOB

-- Query the table definition through the <code>DBMS_METADATA</code> package.

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual;

To zasadniczo pokazuje instrukcję create dla sposobu tworzenia tabeli odniesienia. Wiedząc, jak Tabela jest tworzona, możesz zobaczyć wszystkie ograniczenia tabeli.

ODPOWIEDŹ zaczerpnięta z bloga Michaela McLaughlina: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data / z jego projektu bazy danych I klasy.

 1
Author: FrostyDog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 22:58:46

Borykałem się z tym samym problemem, próbując obejść niestandardowe ograniczenie czeku, które musiałem zaktualizować, aby zezwolić na różne wartości. Problem polega na tym, że ALL_CONSTRAINTS nie ma sposobu na określenie, do której kolumny mają zastosowanie ograniczenia. Sposób, w jaki udało mi się to zrobić, polega na zapytaniu ALL_CONS_COLUMNS, a następnie zrzuceniu każdego z ograniczeń po nazwie i odtworzeniu go.

Select constraint_name from all_cons_columns where table_name = [TABLE_NAME] and column_name = [COLUMN_NAME];

 0
Author: CaduMaciel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-16 15:57:49

Coś takiego przytrafiło mi się, gdy robiłem kopie struktur do tabel tymczasowych, więc usunąłem not null.

DECLARE
   CURSOR cur_temp_not_null IS
        SELECT table_name, constraint_name  FROM all_constraints WHERE table_name LIKE 'TEMP_%' AND  owner='myUSUARIO';

   V_sql VARCHAR2(200); 

BEGIN
  FOR c_not_null IN cur_temp_not_null
   LOOP
     v_sql :='ALTER TABLE ' || c_not_null.table_name || ' DROP CONSTRAINT '|| c_not_null.constraint_name;
     EXECUTE IMMEDIATE  v_sql;     
  END LOOP;
END;
 0
Author: Francisco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-10 19:49:05

Jeśli ograniczenie dotyczące statusu kolumny zostało utworzone bez nazwy podczas tworzenia tabeli, Oracle przypisze jej losową nazwę. Niestety, nie możemy bezpośrednio zmodyfikować ograniczenia.

Kroki polegające na zrzuceniu nienazwanego ograniczenia związanego ze statusem Kolumny

  1. Zduplikuj pole statusu do nowego pola STATUS2
  2. Zdefiniuj ograniczenia kontroli na STATUS2
  3. Migracja danych ze statusu do STATUS2
  4. Drop STATUS column
  5. Zmień nazwę STATUS2 na STATUS

    ALTER TABLE MY_TABLE ADD STATUS2 NVARCHAR2(10) DEFAULT 'OPEN'; ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_CHECK_STATUS CHECK (STATUS2 IN ('OPEN', 'CLOSED')); UPDATE MY_TABLE SET STATUS2 = STATUS; ALTER TABLE MY_TABLE DROP COLUMN STATUS; ALTER TABLE MY_TABLE RENAME COLUMN STATUS2 TO STATUS;

 0
Author: Lukasz Ciesluk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-16 18:34:21