当我创建一个视图时,我基本上正在制作一个新表,当它连接的一个表中的一个表中的数据中,该表将自动进行交易;那是对的吗?

另外,为什么我不能在我看来使用子征服?

有帮助吗?

解决方案

视图有效 像桌子, ,但这不是桌子。它永远不会存在;它只是一个准备好的SQL语句,当您引用视图名称时运行。 IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

...等同于运行:

SELECT x.* 
  FROM (SELECT * FROM bar) x

mysqldump永远不会包含要插入视图的行...

另外,为什么我不能在我的视图中使用子征服????

可悲的是,这是(尽管值得怀疑的)设计。 MySQL视图有许多局限性,这些局限性记录为: http://dev.mysql.com/doc/refman/5.0/en/create-view.html

因此,如果只是一个虚构的表/准备的陈述,这是否意味着它的理论上具有与普通表/查询相同的性能(甚至更低)?


不。
表可以具有关联的索引,这可以使数据检索更快(以插入/更新为代价)。一些数据库支持“实现”视图,这些视图是可以适用于它们的索引的视图 - MySQL不足为奇 不支持 考虑到有限的视图功能(该功能仅在V5 IIRC开始,很晚才开始)。

因为视图是派生表,所以视图的性能与构建的查询一样好。如果该查询很糟糕,则性能问题将只是滚雪球...也就是说,在查询视图时 - 如果在函数中未包装的视图列引用(即::: WHERE v.column LIKE ..., 不是 WHERE LOWER(t.column) LIKE ...),优化器可以将标准(称为谓词)推向原始查询 - 使其更快。

其他提示

我也遇到了同样的问题(令我惊讶的是,因为我的搜索似乎表明Oracle和MS确实支持它)。

我通过为我的最终视图创建另外两个视图来解决这个限制(至少目前,直到被证明是不可使用的)。

例子:

CREATE VIEW Foo1 AS
    SELECT * FROM t ORDER BY ID, InsertDate DESC

CREATE VIEW Foo2 AS
    SELECT * FROM Foo1 GROUP BY ID

CREATE VIEW Foo AS
    SELECT * FROM Foo2 ORDER BY ID

上面的示例基本上具有一个“ t”表,该表是一个包含所有修订的时间表。我的“ foo”(视图)基本上只是我对每个记录的最新修订的简单视图。似乎现在好起来了!

更新:

我不知道这是否是MySQL 5.1中的另一个错误,但是上面的示例实际上不起作用! “ foo1”按预期工作,但是“ foo2”似乎忽略了分组之前的顺序,因此我的最终结果不是预期的。如果我更改为“ ASC”的“ desc”(令人惊讶的是),我什至会得到相同的结果。

另外,如果您阅读 17.5.1。查看语法 该部分显然指出:

“可以从多种选择的语句中创建一个视图。它可以参考基本表或其他视图。它可以使用加入,联合和子查询。”

我将将数据库更新为5.6,然后重试!

区别是:

对于查看

CREATE VIEW v AS SELECT * FROM foo WHERE id IN (SELECT id FROM bar) 

可以正常工作 - 但与此同时,您可以获得只读的视图...单个表上的简单视图将允许“通过”视图更新到基础表

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top