如何更改所有列的Null约束?

时间:2015-11-19 10:30:53

标签: sql oracle

我有一些带有<context-param> <description>Set to true to disable compression of CSS class names for skinning keys and have more human readable class names</description> <param-name>org.apache.myfaces.trinidad.DISABLE_CONTENT_COMPRESSION</param-name> <param-value>true</param-value> </context-param> 约束的大表(30多列)。我想将所有这些约束更改为NOT NULL。要为单个列执行此操作,我可以使用

NULL

有没有办法在一个请求中为所有列执行此操作?或者我应该为所有列复制/粘贴此行(&gt;&lt;)?

3 个答案:

答案 0 :(得分:2)

  

有没有办法在一个请求中为所有列执行此操作?

是。通过(ab)在 PL / SQL 中使用 EXECUTE IMMEDIATE 。通过查询 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; 

在我看来,当你编写PL / SQL块时,你可以通过使用一个好的文本编辑器来快速完成。在纯 SQL 中,您只需要30个查询30列。

答案 1 :(得分:2)

对于单个表,您可以发出一个alter table命令来将列出的列设置为允许null,这比一次运行一列更有效,但您仍需要列出每一栏。

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

如果您正在应用not null约束,那么这将更有价值,因为它们需要扫描表以确保不存在空值,并且(我认为)是独占表锁。

答案 2 :(得分:1)

您可以查询user_tab_cols并将其与FOR光标&amp; EXECUTE IMMEDIATE修改所有非空列 - 执行的PL / SQL块看起来像这样:

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中运行查询,以确保提取的列确实是要修改的正确的列

相关问题