我在数据库课程中掌握一个概念时遇到了麻烦。我们正在审视观点。我理解大部分的实用程序和语法。我在尝试插入我创建的视图时遇到了麻烦。
例如,
create table employees ( firstname varchar2(15), lastname varchar2(15), Gender char(1));
现在,当我只查看所有男性的名字和姓氏时。
像
这样的东西create view maleEMP AS select firstname, lastname FROM employees where gender = 'm';
现在这将创建一个包含男性员工的视图..但是在尝试将新男性插入maleEMP表时遇到问题,并且它们实际上出现在maleEMP表中。我认为我应该寻找某种形式的约束?我已经投资了FORCE和CHECK,但这似乎不是正确的方法。
任何见解都会很好:)
这仅供学习
答案 0 :(得分:2)
约束可能会阻止您通过修改视图数据向基础表添加新行。
例如,可能存在性别必须是“M”或“F”之一的约束,并且当您在male_emp视图中插入未提供值时。但在这种情况下,你应该得到一个错误。
解决此类问题的一种常见方法是使用INSTEAD OF触发器,它允许您拦截视图上的DML并根据更改执行任何您喜欢的操作。
答案 1 :(得分:0)
要查看约束(不使用SQL开发人员),请使用:
select *
from all_constraints
where table_name like '%EMPLOYEES%'
答案 2 :(得分:0)
不要混淆条款" table"和"查看"。表是数据库中的数据结构。视图只是存储在数据库中的SELECT语句。某些数据库(例如Oracle)允许您通过视图插入或更新 - 但有时仅在有限的情况下插入或更新。
关于"如何使这项工作?",您需要在视图上创建一个INSTEAD OF INSERT触发器,然后可以将INSERT重定向到相应的表,添加值根据需要丢失的字段。警告:这是一个非常糟糕的想法,这证明了关于&#34的古老谚语;仅仅因为你可以做某事并不意味着你应该做某事&# 34 ;.这种东西变成了一种扭曲的意大利面式的架构(如果你可以称之为)那里的触发器触发其他触发器,这些触发器调用其他触发其他触发器的代码......严重的是,不要去那里。插入代码中的正确表格。它将为您节省数小时的调试时间。
祝你好运。