2010-01-26 63 views
2

對於我的MySQL數據庫中的每個表,我有一個mytablename.sql文件,其中包含該表的CREATE TABLE語句。如何測試SQL「CREATE TABLE」語句是否與現有表相同?

我想添加一個測試,以檢查沒有人在活動數據庫中添加/更改列而不更新此文件 - 即,我想檢查是否可以使用這些腳本重新創建空數據庫。

我該如何可靠地做到這一點?

一個選項將使用SHOW COLUMNS FROM mytable(或DESCRIBE mytable),其在命令行上會以表格形式像這樣輸出:

+---------+------------------+------+-----+---------------------+----------------+ 
| Field | Type    | Null | Key | Default    | Extra   | 
+---------+------------------+------+-----+---------------------+----------------+ 
| pk_guid | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| d_start | datetime   | NO | MUL | 0000-00-00 00:00:00 |    | 
| d_end | datetime   | NO | MUL | 0000-00-00 00:00:00 |    | 
+---------+------------------+------+-----+---------------------+----------------+ 

然後創建一個臨時表,並比較結果。

這樣可以,但是如果任何列已被添加到實時數據庫中,那麼結果可能不是相同的行順序。

不幸的是,似乎無法使用ORDER BYSHOW COLUMNS

另一種選擇是使用SHOW CREATE TABLE,但包括信息,如AUTO_INCREMENT計數器值,我不關心。

有沒有更好的方法來做到這一點?

+0

我認爲SHOW CREATE TABLE是最好的你可以得到。誰在乎是否有其他信息,您可以輕鬆地將其關閉。 – 2010-01-26 17:02:30

回答

1

我使用一個有點貧民窟/管磁帶PHP shell腳本做到了這一點跨過數據庫服務器(dev/production setup)。鑑於你有2臺服務器,其中之一是「正確」:

  • 抓住每個表的列列表來檢查。 SHOW CREATE TABLE作品,或者只是SELECT * FROM x LIMIT 1,如果您對可能更改的數據類型/默認值不感興趣。
  • array_sort()字段名稱的字母順序,並依次通過比較每個潛在的任何改變你感興趣的內容。

雖然不推薦這個!我之所以這樣做,是因爲系統管理員沒有想到給某些外包人員授予完整的數據庫權限,所以它只是一個快速的安全網絡,沒有計劃或永久性的單元測試。


更優雅&更清潔的方式來做到這一點(限的MySQL5 +關係嗎?)會使用information_schema系統數據庫,特別是COLUMNS表。如果您沒有2臺服務器,則可以使用單獨的數據庫來保存/複製列信息(例如具有最新「正確」模式的information_schema的克隆)。這可以讓你區分新/刪除表,索引,觸發器,過程,用戶/權限等。

1

你寫道:

一種選擇是使用SHOW COLUMNS ...在命令行上.... [但列]可能無法在同一行的順序。

您可能會強制執行此命令,事後。在UNIX十歲上下的系統,你可以簡單地說:

$ mysql -Bse 'SHOW COLUMNS FROM possibly_altered' | sort 

和比較,以同樣回吐和整理由你.sql文件進行了臨時表SHOW輸出。 (該-Bs抑制一些MySQL的(1)別緻的格式和頭,沒有必要和一個更有計劃性比較略感不便。)

相關問題