Oracle ORA-01451: 要修改为 NULL 的列无法修改为 NULL,是啥原因?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle ORA-01451: 要修改为 NULL 的列无法修改为 NULL,是啥原因?相关的知识,希望对你有一定的参考价值。

产生此错误的原因是Oracle中不允许将NULL字段修改为NULL字段。

如果要修改可在之前判断一下,然后再修改,给出样例代码如下:

declare
  visnull varchar2(4);
begin
  select nullable
    into visnull
    from user_tab_columns
   where table_name = upper(\'tblStockInspect\')
     and column_name = upper(\'FDepartID\');
  if visnull = \'N\' then
    execute immediate \'alter table tblStockInspect modify FDepartID int null\';
  end if;
end;
参考技术A

最可能的问题,你的gradeld已是允许null了你可测试下,先改为not nullalter table GRADE modify gradeld not null;如果成功,再改回来alter table GRADE modify gradeld null。

修改oracle字段的数据类型,提示不兼容的解决方法:

1、假设字段数据为空,则不管改为什么字段类型,可以直接执行:


alter table tb modify (name nvarchar2(20));



2、假设字段有数据,则改为nvarchar2(20)可以直接执行:


alter table tb modify (name nvarchar2(20));



3、假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题:



/*修改原字段名name为name_tmp*/


alter table tb rename column name to name_tmp;



/*增加一个和原字段名同名的字段name*/


alter table tb add name varchar2(40);

/*将原字段name_tmp数据更新到增加的字段name*/


update tb set name=trim(name_tmp);



/*更新完,删除原字段name_tmp*/


alter table tb drop column name_tmp;

参考技术B 最可能的问题,你的gradeld已是允许null了你可测试下,先改为not nullalter table GRADE modify gradeld not null;如果成功,再改回来alter table GRADE modify gradeld null;本回答被提问者和网友采纳 参考技术C 字段由不允许为空改为允许为空,更改为不含not null的原表结构即可;
如:alter table userinfo modify id VARCHAR2 (10);
参考技术D 求毕业留言

坑向: 关于在Navicat中对Oracle数据库表空间的数据文件进行重命名和修改路径时报错ORA-01511,ORA-01121,ORA-01110的解决办法

坑向: 关于在Navicat中对Oracle数据库表空间的数据文件进行重命名和修改路径时报错ORA-01511,ORA-01121,ORA-01110的解决办法

1 环境介绍

  • windows环境
  • Navicat Premium 12

2.1 发生的问题

Oracle数据库文件进行重命名或修改路径时发生 类似错误

2.2 实现目标

将原数据文件 D:\\NEWFILE (其对应表空间为TEST)
重新命名并放置在新的路径下,成为新的数据文件 D:\\OracleDataFile\\BLOCK2

3 主要思路

  1. 将Oracle数据库完全打开(open状态),
  2. 以system用户(只要具有可以修改数据文件的权限即可)登录数据库后(采用Navicat连接数据库),
  3. 将需要修改的表空间设置为离线(需要修改的数据文件属于该表空间),
  4. 手动先复制原数据文件到指定目录下,并重命名该文件,
  5. 最后在Navicat中执行相关的修改操作。

4 具体步骤

4.1 打开数据库

启动相关Oracle数据库服务 或 使用sql plus 的 startup命令

4.2 在Navicat上进行对Oracle数据库的连接

4.3.1 选择表空间

4.3.2 找到目标表空间及待修改的数据文件NEWFILE,发现其所属表空间为TEST

4.3.3 将目标表空间设置为离线

4.4 在windows系统中利用windows的图形化文件管理系统 手动将原数据文件进行拷贝(原数据文件NEWFILE复制的目标路径下,并进行重命名)

4.4.1 选择原数据文件 D:\\NEWFILE

4.4.2 复制到目标路径下 D:\\OracleDataFile\\

4.4.3 对手动复制的数据文件进行重命名为 BLOCK2

4.5 在Navicat中进行修改相关属性操作并保存


保存查看最终效果

4.6 如需要对数据文件进行额外操作,需要及时将表空间再次设置为在线(具体可参照4.3.3)

以上是关于Oracle ORA-01451: 要修改为 NULL 的列无法修改为 NULL,是啥原因?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中:要修改为null的列无法修改为null

oracle删除表字段和oracle表增加字段

ORACLE nvl函数

oracle修改字段类型由varchar2修改为clob类型

oracle怎么校验字段是不是为非空约束

oracle怎么用一个表的多个字段数据更新另一个表相应的字段中