我读过一本教科书,(通常)可更新视图是包括基本关系中的PK和(可能)不允许NULL的属性的视图。 NULL有什么问题?我已经在MySQL中进行了尝试,并且能够使用NULL更新视图。
答案 0 :(得分:0)
何时可以更新视图? 1.视图是基于一个且仅一个表定义的。
视图必须包含创建视图所依据的表的PRIMARY KEY。
视图中不应有任何由聚合函数组成的字段。
视图的定义中不能包含任何DISTINCT子句。
视图的定义中不得包含任何GROUP BY或HAVING子句。
视图的定义中不得包含任何子查询。
如果您要更新的视图基于另一个视图,则后者应该是可更新的。
(视图的)任何选定的输出字段都不得使用常量,字符串或值表达式。 这里有一个与null值有关的示例:
样本表:代理商
+------------+----------------------+--------------------+------------+-----------------+---------+
| AGENT_CODE | AGENT_NAME | WORKING_AREA | COMMISSION | PHONE_NO | COUNTRY |
+------------+----------------------+--------------------+------------+-----------------+---------+
| A007 | Ramasundar | Bangalore | 0.15 | 077-25814763 | |
| A003 | Alex | London | 0.13 | 075-12458969 | |
| A008 | Alford | New York | 0.12 | 044-25874365 | |
| A011 | Ravi Kumar | Bangalore | 0.15 | 077-45625874 | |
| A010 | Santakumar | Chennai | 0.14 | 007-22388644 | |
| A012 | Lucida | San Jose | 0.12 | 044-52981425 | |
| A005 | Anderson | Brisban | 0.13 | 045-21447739 | |
| A001 | Subbarao | Bangalore | 0.14 | 077-12346674 | |
| A002 | Mukesh | Mumbai | 0.11 | 029-12358964 | |
| A006 | McDen | London | 0.15 | 078-22255588 | |
| A004 | Ivan | Torento | 0.15 | 008-22544166 | |
| A009 | Benjamin | Hampshair | 0.11 | 008-22536178 | |
+------------+----------------------+--------------------+------------+-----------------+---------+
要使用以下条件更新视图“ agentview”-
“佣金”必须设置为.13,
“工作区”必须为“伦敦”,
可以使用以下SQL语句:
SQL代码:
UPDATE agentview
SET commission=.13
WHERE working_area=’London’;
在以下主题中,我们正在讨论,如果使用算术表达式创建视图的任何字段,则无法更新视图(使用UPDATE VIEW语句)。
示例:
样品表:客户
+-----------+-------------+-------------+--------------+--------------+-------+-------------+-------------+-------------+---------------+--------------+------------+
|CUST_CODE | CUST_NAME | CUST_CITY | WORKING_AREA | CUST_COUNTRY | GRADE | OPENING_AMT | RECEIVE_AMT | PAYMENT_AMT |OUTSTANDING_AMT| PHONE_NO | AGENT_CODE |
+-----------+-------------+-------------+--------------+--------------+-------+-------------+-------------+-------------+---------------+--------------+------------+
| C00013 | Holmes | London | London | UK | 2 | 6000.00 | 5000.00 | 7000.00 | 4000.00 | BBBBBBB | A003 |
| C00001 | Micheal | New York | New York | USA | 2 | 3000.00 | 5000.00 | 2000.00 | 6000.00 | CCCCCCC | A008 |
| C00020 | Albert | New York | New York | USA | 3 | 5000.00 | 7000.00 | 6000.00 | 6000.00 | BBBBSBB | A008 |
| C00025 | Ravindran | Bangalore | Bangalore | India | 2 | 5000.00 | 7000.00 | 4000.00 | 8000.00 | AVAVAVA | A011 |
| C00024 | Cook | London | London | UK | 2 | 4000.00 | 9000.00 | 7000.00 | 6000.00 | FSDDSDF | A006 |
| C00015 | Stuart | London | London | UK | 1 | 6000.00 | 8000.00 | 3000.00 | 11000.00 | GFSGERS | A003 |
| C00002 | Bolt | New York | New York | USA | 3 | 5000.00 | 7000.00 | 9000.00 | 3000.00 | DDNRDRH | A008 |
| C00018 | Fleming | Brisban | Brisban | Australia | 2 | 7000.00 | 7000.00 | 9000.00 | 5000.00 | NHBGVFC | A005 |
| C00021 | Jacks | Brisban | Brisban | Australia | 1 | 7000.00 | 7000.00 | 7000.00 | 7000.00 | WERTGDF | A005 |
| C00019 | Yearannaidu | Chennai | Chennai | India | 1 | 8000.00 | 7000.00 | 7000.00 | 8000.00 | ZZZZBFV | A010 |
| C00005 | Sasikant | Mumbai | Mumbai | India | 1 | 7000.00 | 11000.00 | 7000.00 | 11000.00 | 147-25896312 | A002 |
| C00007 | Ramanathan | Chennai | Chennai | India | 1 | 7000.00 | 11000.00 | 9000.00 | 9000.00 | GHRDWSD | A010 |
| C00022 | Avinash | Mumbai | Mumbai | India | 2 | 7000.00 | 11000.00 | 9000.00 | 9000.00 | 113-12345678 | A002 |
| C00004 | Winston | Brisban | Brisban | Australia | 1 | 5000.00 | 8000.00 | 7000.00 | 6000.00 | AAAAAAA | A005 |
| C00023 | Karl | London | London | UK | 0 | 4000.00 | 6000.00 | 7000.00 | 3000.00 | AAAABAA | A006 |
| C00006 | Shilton | Torento | Torento | Canada | 1 | 10000.00 | 7000.00 | 6000.00 | 11000.00 | DDDDDDD | A004 |
| C00010 | Charles | Hampshair | Hampshair | UK | 3 | 6000.00 | 4000.00 | 5000.00 | 5000.00 | MMMMMMM | A009 |
| C00017 | Srinivas | Bangalore | Bangalore | India | 2 | 8000.00 | 4000.00 | 3000.00 | 9000.00 | AAAAAAB | A007 |
| C00012 | Steven | San Jose | San Jose | USA | 1 | 5000.00 | 7000.00 | 9000.00 | 3000.00 | KRFYGJK | A012 |
| C00008 | Karolina | Torento | Torento | Canada | 1 | 7000.00 | 7000.00 | 9000.00 | 5000.00 | HJKORED | A004 |
| C00003 | Martin | Torento | Torento | Canada | 2 | 8000.00 | 7000.00 | 7000.00 | 8000.00 | MJYURFD | A004 |
| C00009 | Ramesh | Mumbai | Mumbai | India | 3 | 8000.00 | 7000.00 | 3000.00 | 12000.00 | Phone No | A002 |
| C00014 | Rangarappa | Bangalore | Bangalore | India | 2 | 8000.00 | 11000.00 | 7000.00 | 12000.00 | AAAATGF | A001 |
| C00016 | Venkatpati | Bangalore | Bangalore | India | 2 | 8000.00 | 11000.00 | 7000.00 | 12000.00 | JRTVFDD | A007 |
| C00011 | Sundariya | Chennai | Chennai | India | 3 | 7000.00 | 11000.00 | 7000.00 | 11000.00 | PPHGRTS | A010 |
+-----------+-------------+-------------+--------------+--------------+-------+-------------+-------------+-------------+---------------+--------------+------------+
下面的语句创建一个视图“ myclient”:
SQL代码:
CREATE VIEW myclient(client_name,client_no,outspercent)
AS SELECT cust_name,cust_code
outstanding_amt*100/(opening_amt+receive_amt)
FROM customer
WHERE cust_country='USA'
AND outstanding_amt*100/(opening_amt+receive_amt)>50;
要使用以下条件更新视图“ myclient”-
可以使用以下SQL语句:
SQL代码:
UPDATE myclient SET outspercent=80;
但请参阅:
This view is a not an updatable view. Arithmetic expression has been used in the definition of the view. So this view is not updatable i.e. the 'view' is read only.
答案 1 :(得分:0)
根据您的评论,我决定将此答案专用于空值状态,以进行插入和更新: 基础对象中的NULL值 当派生视图的表或视图中包含某些NOT NULL列时,此限制适用于插入语句。
例如,假设在视图下方的表的列中不允许使用空值。通常,当您通过视图插入新行时,基础表中未包含在视图中的所有列都将被赋予空值。如果在这些列中的一列或多列中不允许使用null值,则不允许通过该视图插入。
例如,在此视图中:
create view business_titles
as select title_id, price, total_sales
from titles
where type = "business"
在基础表标题的标题列中不允许使用空值,因此不允许通过business_view插入语句。尽管视图中甚至没有标题栏,但禁止使用null值会使视图中的任何插入均非法。
类似地,如果title_id列具有唯一索引,则即使该条目不重复该视图中的任何值,也会拒绝将重复该基础表中任何值的更新或插入。 来自SAP Adaptive Server Enterprise 16.0 希望您得到所需的东西。