我正在尝试为一位同事填写一些Oracle工作,并陷入困境。在尝试编写脚本以将列修改为可为空时,我遇到了可爱的ORA-01451错误:
ORA-01451: column to be modified to NULL cannot be modified to NULL
发生这种情况是因为列已经为NULL。我们有几个需要更新的数据库,所以在我错误的假设中,我认为将其设置为NULL应该全面工作以确保每个人都是最新的,无论他们是否已将此列手动设置为可为空。但是,对于已经将列作为可空的人来说,这显然会导致错误。
如何检查列是否已经可以为空以避免错误?能够实现这个想法的东西:
IF( MyTable.MyColumn IS NOT NULLABLE)
ALTER TABLE MyTable MODIFY(MyColumn NULL);
答案 0 :(得分:44)
您可以在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;
答案 1 :(得分:21)
只需执行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;
/
如果您不想使用PL / SQL
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并忽略错误。