sql视图中如何插入新的数据

sql视图中如何插入新的数据,第1张

对于 单表的视图, 插入/修改 数据是没有问题的。 (只要你不做特别的设置)对于多表的视图, *** 作的时候,会存在一定的问题。下面是一个例子:1>CREATE VIEW v_main_sub AS2>SELECT3> test_main.id AS main_id,4> test_main.value AS main_value,5> test_sub.id AS sub_id,6> test_sub.value AS sub_value7>FROM8> test_main, test_sub9>WHERE10> test_main.id = test_sub.main_id11>go1>SELECT * FROM v_main_sub2>gomain_id main_value sub_id sub_value----------- ---------- ----------- ---------- 1 ONE 1 ONEONE 2 TWO 2 TWOTWO(2 行受影响)1>UPDATE v_main_sub2>SET main_value='ONX'3>WHERE main_id = 14>go(1 行受影响)1>UPDATE v_main_sub2>SET sub_value='ONXONX'3>WHERE main_id = 14>go(1 行受影响)1>DELETE FROM v_main_sub WHERE main_id = 12>go消息 4405,级别 16,状态 1,服务器 GMJ-PC\SQLEXPRESS,第 1 行视图或函数 'v_main_sub' 不可更新,因为修改会影响多个基表。-- 这个触发器, 只测试输出, 不删除数据。1>CREATE TRIGGER v_main_sub_trigger2>ON v_main_sub3>INSTEAD OF DELETE4>AS5>DECLARE6> @main_id INT,7> @sub_id INT8>BEGIN9> SELECT @main_id=main_id, @sub_id=sub_id FROM deleted10>11>12> PRINT(@main_id)13> PRINT(@sub_id)14>END15>go1>DELETE FROM v_main_sub WHERE main_id = 12>go11(1 行受影响)1>DELETE FROM v_main_sub WHERE sub_id = 12>go11(1 行受影响)对于多表关联的视图, 删除的时候,需要人为的去判断例如当 主表 和 子表,都只有一条记录的情况下。无法判断 本次删除, 是要删除掉一个子表的记录,留下主表的。还是 主表 子表的数据,一同删除。

首先,要清楚视图的概念:

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

由于视图的数据来自自定义视图时的查询所引用的表,因此要想在视图中新增一个全新的字段,只需要在其引用的表中增加此字段,然后修改生成动态视图的查询语句即可;

在表中增加此字段的语法是

如果此字段为int型,是不能指定长度的:alter table 表名 add 字段 int 0

如果此字段为char型:alter table 表名 add 字段 char(10) null

如果此字段为数值型:alter table 表名 add 字段 DECIMAL(10,0) 0

视图是从一个或多个表中查询出来的数据保存为视图,是一种虚拟存在的表。

注意:

数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。

使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。

2、为什么要使用视图

重复利用SQL语句

简化SQL查询,快速取数据

只用知道表的部分结构

保护数据,根据特定授权(分配用户一定权限,安全性)

更改数据格式,视图可返回与底层表的格式不同的数据表,展现出来。

3、视图与表的区别:

表要占用磁盘空间,视图不需要

视图不能添加索引

使用视图可以简化查询

视图可以提高安全性

4 .创建视图

CREATE VIEW语法

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

VIEW view_name [(column_list)]

AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

解释::

OR REPLACE: 替换重复视图名(可选)

ALGORITHM:可选的ALGORITHM子句是对标准SQL的MySQL扩展

可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。

对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/6185584.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-17
下一篇2023-03-17

发表评论

登录后才能评论

评论列表(0条)

    保存