2008-12-01 81 views
2

我在使用MySQL 5開發了一個應用程序,它使用視圖來訪問主要數據段。事實證明,我們的生產服務器使用MySQL 4,它沒有包含視圖。MySQL - 視圖替代

有沒有人有一個快速和骯髒的方式來處理這不涉及重寫我的所有代碼?

+0

升級生產服務器? :) – Greg 2008-12-01 21:32:03

+0

男人,我知道MySQL是一個玩具,但我不知道... – 2008-12-01 21:40:44

+0

@Paul:三年前發佈了MySQL 5.0,支持視圖,觸發器和存儲過程。較舊版本的任何軟件都可能被視爲較弱。 – 2008-12-01 21:53:59

回答

2

這當然指出了在開發和生產環境中使用相同技術的重要性!

涉及觸發器或存儲過程的變通辦法將不起作用,因爲MySQL 4.x上也不支持這些變通辦法。

你在這一點上的選項:

  • 重寫應用程序代碼複製在非規範化的表,設計,以配合您的視圖中的數據。

  • 將生產數據庫升級到MySQL 5.0。如果您正在討論託管服務提供商,請聯繫該提供商並詢問他們是否有MySQL 5.0選項,否則您需要重新安置到提供商。

我建議後者的路徑,它將遠遠少於編寫代碼來管理重複數據。

請注意,MySQL 4.1作爲四年前的生產軟件發佈。對此版本的主動支持在2006年結束。對MySQL 4.1的擴展支持在2009年12月31日結束。請參閱http://www.mysql.com/about/legal/lifecycle/

+0

謝謝 這是,可悲的是,我的僱主。他們在生產和開發服務器上有不同的環境,甚至不願意告訴他們的程序員。升級不是一種選擇。我想知道Joel測試會對此有何評論? – MattBelanger 2008-12-01 21:44:16

0

不幸的是,沒有升級到MySQL 5,可能不是。

1

ouch。除了DeLorean和助焊劑電容器或升級服務器之外,我不知道有什麼簡單的方法可以解決此問題。很多改變似乎是必要的。

2

想到的是一種快速且非常髒的方式,即將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; 

SELECT v1.* FROM (
    SELECT a, b, c FROM real_table WHERE fooable = 1 
) v1; 

至少,後者語法工作在5.0.x的,我認爲它應該在4.1.x版以及。

如果您使用的是4.0版本,那麼它不會那麼容易。