代码之家  ›  专栏  ›  技术社区  ›  Jay S

在oracle中修改列-如何在设置为可空之前检查列是否可空?

  •  34
  • Jay S  · 技术社区  · 15 年前

    ORA-01451: column to be modified to NULL cannot be modified to NULL
    

    发生这种情况是因为列已为NULL。我们有几个数据库需要进行udpated,因此在我错误的假设中,我认为将其设置为NULL应该可以全面工作,以确保每个人都是最新的,无论他们是否手动将此列设置为NULL。然而,对于一些已经将列设置为可空的人来说,这显然会导致一个错误。

    如何检查列是否已经可以为空以避免错误?能够实现这个想法的东西:

    IF( MyTable.MyColumn IS NOT NULLABLE)
       ALTER TABLE MyTable MODIFY(MyColumn  NULL);
    
    2 回复  |  直到 15 年前
        1
  •  47
  •   Iván Tony Andrews    6 年前

    您可以在PL/SQL中执行此操作:

    declare
      l_nullable user_tab_columns.nullable%type;
    begin
      select nullable into l_nullable
      from user_tab_columns
      where table_name = 'MYTABLE'
      and   column_name = 'MYCOLUMN';
    
      if l_nullable = 'N' then
        execute immediate 'alter table mytable modify (mycolumn null)';
      end if;
    end;
    
        2
  •  24
  •   Rob van Laarhoven    11 年前

    只需执行alter table并捕获异常。

    DECLARE
       allready_null EXCEPTION;
       PRAGMA EXCEPTION_INIT(allready_null, -1451);
    BEGIN
       execute immediate 'ALTER TABLE TAB MODIFY(COL  NULL)';
    EXCEPTION
       WHEN allready_null THEN
          null; -- handle the error
    END;
    /
    

        set feedback off
        set echo off
        set feedback off
        set pages 0
        set head off
    
        spool to_null.sql
    
        select 'alter table TAB modify (COL NULL);' 
        from user_tab_columns
        where table_name = 'TAB'
        and column_name = 'COL'
        and nullable = 'N';
    
        spool off
        set feedback on
        set echo on
        set termout on
        @@to_null.sql 
        host rm -f to_null.sql
    

    或者只是执行alter table并忽略错误。