2015-11-19 3 views
1

У меня есть большие таблицы (30+ столбцов) с ограничениями NOT NULL. Я хотел бы изменить все эти ограничения на NULL. Чтобы сделать это для одной колонки, я могу использоватьКак изменить ограничение Null для всех столбцов?

Есть ли способ сделать это для всех столбцов в одном запросе? Или мне нужно скопировать/вставить эту строку для всех столбцов (> <)?

+0

Copy-paste. Но зачем удалять эти ограничения? (Код приложения может зависеть от них.) – jarlh

+1

Вы можете использовать PL/SQL, но если вы не знаете язык, он будет быстрее скопировать/вставить или выполнить поиск/замену. Вы могли бы помочь генерировать код, выбрав столбцы в системной таблице. Dba_tab_cols – Aaron

+0

@jarlh Длинная история ... Недавно я пришел к этому проекту с серьезной проблемой дизайна. Большая часть значения равна нулю, поэтому это ограничение должно быть изменено. – ThomasThiebaud

ответ

2

Есть ли способ сделать это для всех столбцов в одном запросе?

Да. По (ab) с использованием EXECUTE IMMEDIATE в PL/SQL. Прокрутите все столбцы, запросив USER_TAB_COLUMNS вид.

Например,

FOR i IN 
(SELECT * FROM user_tab_columns WHERE table_name = '<TABLE_NAME>' AND NULLABLE='N' 
) 
LOOP 
    EXECUTE IMMEDIATE 'ALTER TABLE <TABLE_NAME> MODIFY i.COLUMN_NAME NULL'; 
END LOOP; 

На мой взгляд, к тому времени, вы должны написать/SQL блок PL, вы можете сделать это очень быстро, используя хороший текстовый редактор. В чистом SQL вам нужно всего 30 запросов для 30 столбцов.

+2

еще лучше было бы добавить 'NULLABLE = 'N'' в ваш курсор FOR, пропускает столбцы, которые уже обнуляются – Sathya

+0

@Sathya hmm ...это отфильтровывает строки. Но, OP сказал, что у него есть все столбцы как NOT NULL. Но, в любом случае, полезно добавить условие. благодаря –

2

Для одной таблицы вы можете ввести одну команду alter table, чтобы установить перечисленные столбцы, чтобы разрешить null, что немного более эффективно, чем запуск по одному, но вам все равно придется перечислять каждый столбец.

alter table ... 
modify (
    col1 null, 
    col1 null, 
    col3 null); 

Если вы применяли not null ограничения, то это было бы более целесообразно, так как они требуют сканирования таблицы, чтобы гарантировать, что никакие обнуляет нет, и (я думаю), эксклюзивная блокировка таблицы.

1

Вы можете запросить user_tab_cols и объединить его с FOR курсора & EXECUTE IMMEDIATE изменить все не нулевые столбцы -/SQL блок PL для делать так будет выглядеть так:

DECLARE 
    v_sql_statement VARCHAR2(2000); 
BEGIN 
    FOR table_recs IN (SELECT table_name, column_name 
         FROM user_tab_cols 
         WHERE nullable = 'N') LOOP 
    v_sql_statement := 
     'ALTER TABLE ' || table_recs.table_name || ' MODIFY ' || table_recs.column_name || ' NULL'; 

    EXECUTE IMMEDIATE v_sql_statement; 
    END LOOP; 
END; 

Если вы хотите сделайте это для всех столбцов в базе данных, а не в текущей схеме, вы можете заменить user_tab_cols и вставить dba_tab_cols; Я просто запустил запрос в FOR, чтобы убедиться, что нужные столбцы действительно являются правильными, которые должны быть изменены.