问题描述
嗨,汤姆,我有一个关于oracle 12c (字段不可见) 功能的问题。为什么如果我创建一个新的字段,条件不可见,而不是null约束这个失败时,插入值到表,但不启用设置值到语句的新字段。
示例我的实践:
--
该功能是具有不可见属性的字段,始终连接到null值约束?还是我做错了什么?
示例我的实践:
create table temporal (campo1 number(12) not null,
campo2 varchar2(10) not null);
alter table temporal add (campo3 number(12) invisible not null);
insert into temporal values(1, 'ROW 1');
ORA-01400: cannot insert NULL into (squema.TEMPORAL.CAMPO3);
insert into temporal values(1, 'ROW 1', 1);
ORA-00913: too many values
--
该功能是具有不可见属性的字段,始终连接到null值约束?还是我做错了什么?
专家解答
不可见列背后的目标通常是在不影响现有 (或可能是新的) 应用程序代码的情况下从表中添加或删除列。
显然,如果新列不为NULL,那么根据定义,您要求 * 所有 * 应用程序代码都知道它。通常情况下,情况并非如此,因为只有知道新列存在的 * new * 应用程序才会填充它。
如果您需要确保新应用程序没有在插入null时出错,则可以暂时有一个约束,该约束为 * just * 新应用程序实现nullness检查。例如,新应用程序可以设置上下文变量,并且约束条件为:
当所有应用程序代码都已迁移到 * 并且 * 历史数据已更新时,则可以将约束更改为标准not null约束。
显然,如果新列不为NULL,那么根据定义,您要求 * 所有 * 应用程序代码都知道它。通常情况下,情况并非如此,因为只有知道新列存在的 * new * 应用程序才会填充它。
如果您需要确保新应用程序没有在插入null时出错,则可以暂时有一个约束,该约束为 * just * 新应用程序实现nullness检查。例如,新应用程序可以设置上下文变量,并且约束条件为:
alter table T
add constraint chk check ( new_col is not null or sys_context('MY_CONTEXT','APP_VERSION') = '[old version]' );
当所有应用程序代码都已迁移到 * 并且 * 历史数据已更新时,则可以将约束更改为标准not null约束。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




