我想代替一位同事做一些甲骨文的工作,但遇到了麻烦.在try 编写脚本将列修改为可为空时,我遇到了可爱的ORA-01451错误:

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

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

如何判断一个列是否已经可以为空以避免错误?可以实现这个 idea 的东西:

IF( MyTable.MyColumn IS NOT NULLABLE)
   ALTER TABLE MyTable MODIFY(MyColumn  NULL);

推荐答案

可以在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;

Database相关问答推荐

如何使一个IP允许在运行GitHub操作到RDS数据库时,您不允许从外部访问数据库?

add_index 到数据模型 - Ruby on Rails 教程

PostgreSQL 参数化 Order By / Limit in table 函数

如果我使用存储过程,我对 SQL 注入免疫吗?

sql server:在必要时在外键上创建索引

寻找基于磁盘的类 redis 数据库

在插入数据库之前而不是在输出时转义 HTML 是不是一个坏主意?

不同的数据库是否使用不同的名称引用?

向表中添加大量索引是否有缺点?

将 XML 存储在数据库中是否不好?

如何从表列中删除唯一约束?

xtradb vs innodb

如何用 SQL 思考?

我应该使用 NULL 还是空字符串来表示表列中没有数据?

如何在多列上创建 FULLTEXT 索引?

Django + PostgreSQL:如何重置主键?

对于 N:M 关系,在 MongoDB 中推荐的级联删除等效项是什么?

用于存储文件夹系统的数据库模式的 Select

如何在数据库中获取原始的created_at值(不是转换为 ActiveSupport::TimeWithZone 的对象)

是否有任何支持协议缓冲区的数据库?