Как я могу удалить ограничение «не ноль» в Oracle, когда я не знаю имя ограничения? - PullRequest
76 голосов
/ 29 марта 2010

У меня есть база данных с ограничением NOT NULL для поля, и я хочу удалить это ограничение. Осложняющим фактором является то, что это ограничение имеет системное имя, а имя этого ограничения различается для рабочего сервера, сервера интеграции и различных баз данных разработчика. Наш текущий процесс заключается в проверке сценариев изменений, и автоматизированная задача выполняет соответствующие запросы через sqlplus к целевой базе данных, поэтому я бы предпочел решение, которое можно было бы просто отправить прямо в sqlplus.

В моей собственной базе данных SQL для удаления это будет:

alter table MYTABLE drop constraint SYS_C0044566

Я вижу ограничение при запросе к представлению all_constraints:

select * from all_constraints where table_name = 'MYTABLE'

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

Итак, как мне создать скрипт изменения, который может отбросить это ограничение, основываясь на том, что это такое, а не на том, как оно называется?


EDIT: @ Ответ Аллана хороший, но меня беспокоит (из-за отсутствия у меня опыта Oracle), что не всегда может быть правдой, что любое ограничение, которое может иметь сгенерированное системой имя, будет связано с ним, как способ удалить ограничение без необходимость знать его имя. Правда ли, что всегда найдется способ избежать необходимости знать имя системного имени при логическом отбрасывании этого ограничения?

Ответы [ 5 ]

150 голосов
/ 29 марта 2010
alter table MYTABLE modify (MYCOLUMN null);

В Oracle ограничения, не равные NULL, создаются автоматически, если для столбца не указано NULL. Кроме того, они автоматически удаляются при изменении столбца, чтобы разрешить нулевые значения.

Уточнение пересмотренного вопроса : Это решение применимо только к ограничениям, созданным для столбцов «не ноль». Если вы укажете «Первичный ключ» или проверочное ограничение в определении столбца, не назвав его, вы получите сгенерированное системой имя для ограничения (и индекс для первичного ключа). В этих случаях вам нужно знать имя, чтобы бросить его. Лучший совет - избегать сценария, указав имя для всех ограничений, кроме «not null». Если вы окажетесь в ситуации, когда вам нужно вообще удалить одно из этих ограничений, вам, вероятно, придется прибегнуть к PL / SQL и таблицам определения данных.

16 голосов
/ 28 ноября 2010

Попробуйте:

alter table <your table> modify <column name> null;
1 голос
/ 23 мая 2015

Чтобы обнаружить любые ограничения, используйте код ниже:

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

Это, по сути, показывает оператор создания того, как создается ссылочная таблица. Зная, как создается таблица, вы можете увидеть все ограничения таблицы.

Ответ взят из блога Майкла Маклафлина: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ Из его класса Database Design I класс.

1 голос
/ 30 ноября 2012

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

0 голосов
/ 16 декабря 2014

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

выберите ограничение_имя из all_cons_columns где table_name = [TABLE_NAME] и column_name = [COLUMN_NAME];

...