在Oracle数据库中:
我需要视图中的`<% if flash[:notice].present? %>
<script>
$(document).ready(function(){
$('#myModal').modal("show");
});
</script>
<% end %>`
列不可为空。
该视图是两个表的PRODUCT_ID
,列UNION
中的每个表都不可为空。
但由于某种原因,该专栏是nullalbe。
语法:
PRODUCT_ID
感谢帮助者
答案 0 :(得分:0)
问题是,您的视图不是可更新的视图。它是只读的,因为底层查询是两个表的UNION。
如果你有这样的观点
create or replace view view_2
(PRODUCT_ID
, PRODUCT_NAME)
as
SELECT MAP_DATA.PRODUCT_ID, MAP_DATA.PRODUCT_NAME
FROM TABLE_2 MAP_DATA
with check option
/
然后all_tab_cols
'VIEW_2'
的{{1}}查询会显示nullable='N'
。这是因为Oracle可以使用基础表中的列直接映射视图中的列。它不能用UNIONed查询做到这一点(因为一个表的列可以为空,而另一个表是必需的,这是完全可以接受的)。
使用简单视图,我们可以直接对视图执行insert语句。但是,由于显而易见的原因,我们不能用你这样的观点做到这一点(新记录应该在哪个表中?)。为了使视图可更新,我们需要编写一个INSTEAD OF触发器,我们可以在其中强制执行我们需要的任何业务规则。
Oracle允许我们在视图上指定主键和唯一约束(使用魔术RELY DISABLE NOVALIDATE
子句,但不是NOT NULL(即检查)约束。
请注意,即使我们使用如下主键定义视图,该列仍然可以为空:
create or replace view view_1
(PRODUCT_ID
, PRODUCT_NAME
, constraint v1_pk primary key (product_id) rely disable novalidate
)
as
SELECT MAP_DATA.PRODUCT_ID
, MAP_DATA.PRODUCT_NAME
FROM (
select PRODUCT_ID , PRODUCT_NAME
FROM TABLE_1
UNION
SELECT PRODUCT_ID , PRODUCT_NAME
FROM TABLE_2
) MAP_DATA
with check option
/