关于oracleSQL中的约束的一些澄清

时间:2016-09-26 14:30:20

标签: sql oracle

我在数据库课程中掌握一个概念时遇到了麻烦。我们正在审视观点。我理解大部分的实用程序和语法。我在尝试插入我创建的视图时遇到了麻烦。

例如,

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,但这似乎不是正确的方法。

任何见解都会很好:)

这仅供学习

3 个答案:

答案 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 ;.这种东西变成了一种扭曲的意大利面式的架构(如果你可以称之为)那里的触发器触发其他触发器,这些触发器调用其他触发其他触发器的代码......严重的是,不要去那里。插入代码中的正确表格。它将为您节省数小时的调试时间。

祝你好运。