Як я можу скинути обмеження “не нульове” в Oracle, коли я не знаю назви обмеження?


85

У мене є база даних, яка має обмеження NOT NULL для поля, і я хочу видалити це обмеження. Складним фактором є те, що це обмеження має визначене системою ім'я, і ​​ім'я цього обмеження відрізняється між виробничим сервером, сервером інтеграції та різними базами даних розробників. Нашим поточним процесом є перевірка сценаріїв змін, і автоматизоване завдання виконує відповідні запити через sqlplus щодо цільової бази даних, тому я віддаю перевагу рішенню, яке можна просто відправити прямо в sqlplus.

У моїй власній базі даних SQL, щоб скинути це, буде:

alter table MYTABLE drop constraint SYS_C0044566

Я бачу обмеження, коли запитую all_constraintsподання:

select * from all_constraints where table_name = 'MYTABLE'

але я не впевнений, як працювати з типом даних SEARCH_CONDITION's LONGабо як найкраще динамічно видаляти обмеження пошуку, навіть після того, як я знаю його назву.

Отже, як я можу створити сценарій змін, який може скинути це обмеження на основі того, що воно є, а не того, що його ім’я?


EDIT: Відповідь @ Allan хороша, але я стурбований (через відсутність досвіду Oracle), що може не бути загальновірним, що будь-яке обмеження, яке може мати ім'я, згенероване системою, пов'язане із цим способом видалення обмеження, не знаючи його назви. Чи правда, що завжди знайдеться спосіб уникнути необхідності знати ім’я обмеженого іменем під час логічного скидання цього обмеження?


3
Просто для того, щоб задовольнити вашу цікавість: обмеження NOT NULL - це єдиний тип обмежень в Oracle, який ви можете видалити, не знаючи імені обмеження. Для всіх інших типів обмежень вам потрібно знати назву обмеження.
Джеффрі Кемп,

Відповіді:


166
alter table MYTABLE modify (MYCOLUMN null);

В Oracle не нульові обмеження створюються автоматично, коли для стовпця не вказано нульове значення. Подібним чином вони автоматично скидаються при зміні стовпця, щоб дозволити нульові значення.

Уточнення переглянутих питань : Це рішення застосовується лише до обмежень, створених для стовпців "не нульових". Якщо ви визначите "Первинний ключ" або обмеження перевірки у визначенні стовпця, не називаючи його, у підсумку ви отримаєте створене системою ім'я для обмеження (та індекс для первинного ключа). У цих випадках вам потрібно буде знати ім’я, щоб скинути його. Найкраща порада - уникати сценарію, переконавшись, що ви вказали назву для всіх обмежень, крім "не нульове". Якщо ви потрапили в ситуацію, коли вам потрібно узагальнити одне з цих обмежень, вам, ймовірно, доведеться вдатися до PL / SQL і таблиць визначення даних.


Це здається насправді надто приємним, щоб бути правдою, але це, безумовно, розглядає мою поточну справу і просто! Чи є в Oracle випадки, коли ім'я обмеження могло бути створене системою, але sql не вдалося записати, щоб уникнути імені обмеження таким чином?
Chris Farmer

1
Дякую ... виявляється, not nullобмеження - це єдині системні імена в моїй схемі, які, можливо, коли-небудь вплинуть на мене таким чином.
Кріс Фармер


1

Тільки пам’ятайте, якщо поле, яке ви хочете зробити анульованим, є частиною первинного ключа, ви не можете. Первинні ключі не можуть мати нульові поля.


1

Щоб виявити будь-які обмеження, використовуйте код нижче:

-- 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;

Це, по суті, показує оператор create для створення таблиці, на яку посилаються. Знаючи, як створюється таблиця, ви можете побачити всі обмеження таблиці.

Відповідь взято з блогу Майкла Маклафліна: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ З його класу бази даних Design I.


0

Я зіткнувся з тією ж проблемою, намагаючись обійти спеціальне обмеження перевірки, яке мені потрібно було оновити, щоб дозволити різні значення. Проблема в тому, що ALL_CONSTRAINTS не має способу визначити, до якого стовпця застосовуються обмеження. Мені вдалося це зробити, запитуючи натомість ALL_CONS_COLUMNS, а потім скинувши кожне з обмежень за їх ім'ям і відтворивши його.

виберіть ім’я обмеження з усіх стовпців_контексів, де ім'я таблиці = [TABLE_NAME] та ім'я_столбця = [СТОЛЬЧИК];


0

Щось подібне трапилося зі мною, коли я зробив копії структур до тимчасових таблиць, тому видалив не 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;

Переповнення стеку - це веб-сайт лише англійською мовою. Однак існує Stack Overflow en español . Перегляньте мою редакцію.
help-info.de

0

Якщо обмеження на стовпець STATUS було створено без імені під час створення таблиці, Oracle призначить йому випадкове ім'я. На жаль, ми не можемо змінити обмеження безпосередньо.

Етапи, пов’язані зі скиданням безіменного обмеження, пов’язаного зі СТАТУТОМ стовпця

  1. Скопіюйте поле СТАТУС у нове поле СТАТУС2
  2. Визначте обмеження CHECK на STATUS2
  3. Перенесіть дані зі статусу STATUS у статус STATUS2
  4. Відкиньте стовпець STATUS
  5. Перейменуйте STATUS2 на 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;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.