Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-视图替代方案_Mysql - Fatal编程技术网

MySQL-视图替代方案

MySQL-视图替代方案,mysql,Mysql,我已经使用MySQL 5开发了一个应用程序,它使用视图访问主要数据块。事实证明,我们的生产服务器使用的是MySQL 4,它没有包含视图 有没有人有一个快速而肮脏的方法来处理这个问题,而不需要重写我所有的代码 不幸的是,如果不升级到MySQL 5,可能不会。这肯定指出了在开发和生产环境中使用相同技术的重要性 涉及触发器或存储过程的变通方法不起作用,因为MySQL 4.x也不支持这些方法 您在这一点上的选择: 重写应用程序代码以复制非规范化表中的数据,这些表是为匹配视图而设计的 将生产数据库升级到

我已经使用MySQL 5开发了一个应用程序,它使用视图访问主要数据块。事实证明,我们的生产服务器使用的是MySQL 4,它没有包含视图


有没有人有一个快速而肮脏的方法来处理这个问题,而不需要重写我所有的代码

不幸的是,如果不升级到MySQL 5,可能不会。

这肯定指出了在开发和生产环境中使用相同技术的重要性

涉及触发器或存储过程的变通方法不起作用,因为MySQL 4.x也不支持这些方法

您在这一点上的选择:

  • 重写应用程序代码以复制非规范化表中的数据,这些表是为匹配视图而设计的

  • 将生产数据库升级到MySQL 5.0。如果您正在谈论一个托管提供商,那么请联系该提供商并询问他们是否有MySQL 5.0的选项,否则您需要重新定位到一个有此选项的提供商

我推荐后一种方法,它比编写代码来管理重复数据要省力得多


请注意,MySQL 4.1是四年前作为生产软件发布的。对该版本的积极支持在2006年结束。MySQL 4.1的扩展支持将于2009年12月31日结束。见

哎哟。除了DeLorean和flux电容器或升级服务器之外,我不知道有什么简单的方法可以解决这个问题。大量的更改似乎是必要的。

想到的快速而肮脏的方法是将DBI子类化并在那里重新编写SQL。当然,这取决于您使用视图的目的,如果您指的是MySQL 4.0(没有子查询)或MySQL 4.1(有子查询)

如果您使用的是4.1,则可以打开:

CREATE VIEW foo AS
  SELECT a, b, c FROM real_table WHERE fooable = 1;

SELECT * FROM foo;
进入

至少,后一种语法可以在5.0.x中使用,我认为它也应该在4.1.x中使用


如果你在4.0上。。。嗯,这不会那么容易。

升级生产服务器?:)伙计,我知道MySQL是个玩具,但我不知道…@Paul:MySQL 5.0是三年前发布的,支持视图、触发器和存储过程。任何软件的旧版本都可能被认为是脆弱的。谢谢,很遗憾,这是我的雇主。他们在生产和开发服务器上有不同的环境,甚至懒得告诉他们的程序员。升级不是一种选择。我想知道Joel测试对此会说些什么??除非他们在生产服务器方面对你撒谎,否则我会说50%是你的错,因为你在投入大量时间使用特定版本的功能之前没有询问生产服务器正在运行什么。@Bill-lied是一个强有力的词。当我询问live server上的版本时,高级开发人员并没有实际检查——他只是向我保证,如果它在开发环境中工作,那就可以了。您还可以在外部查询中使用列别名更改列名。不管怎样,正如你所说,这将适用于4.1,但我不确定它是否特别快-(是的,可能没那么快。这肯定是需要测试的。
SELECT v1.* FROM (
  SELECT a, b, c FROM real_table WHERE fooable = 1
) v1;