2012-03-26 63 views
1

我試圖在運行時創建一個測試數據庫(基於我的生產數據庫),而不是必須保持一個確切的重複測試數據庫我想複製整個數據結構我的生產數據庫在運行時,然後當我關閉測試數據庫時,刪除整個數據庫。Mysql從SQL語句複製數據庫

我想我會用這樣的話:

CREATE DATABASE test //to create the test db 
CREATE TABLE test.sampleTable LIKE production.sampleTable //to create each table 

,當我完成了測試數據庫,調用close方法將運行類似:

DROP DATABASE test //delete the database and all its tables 

但是怎麼辦我會自動查找生產數據庫中的所有表格,而無需手動將其寫出。我的想法是,我可以操縱我的生產分貝,而不必關心在測試分貝內保持結構的一致性。

在這種情況下是否需要存儲過程?一些示例代碼如何實現這樣的東西將不勝感激。

+0

與其在兩個地方維護結構,您都可以通過[MySQL複製](http://dev.mysql.com/doc/refman/5.0/en/replication.html)執行此操作,因此所有更改(數據和模式)將立即同步測試。 – 2012-03-26 12:47:41

+0

MySQL「SHOW TABLES」命令列出給定數據庫中的非臨時表 – 2012-03-26 12:49:36

+0

不會複製數據庫,其表以及這些表中的所有數據嗎?我的測試數據庫應該有空表,我只想複製表結構。 – ryandlf 2012-03-26 12:50:20

回答

0

的解決方案是爲所需的SQL命令的文件如下:

private static final String SQL_CREATE_TEST_DB = "CREATE DATABASE test"; 
private static final String SQL_PROD_TABLES = "SHOW TABLES IN production"; 

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
jdbcTemplate.execute(SQL_CREATE_TEST_DB); 

SqlRowSet result = jdbcTemplate.queryForRowSet(SQL_PROD_TABLES); 
while(result.next()) { 
    String tableName = result.getString(result.getMetaData().getColumnName(1)); //Retrieves table name from column 1    
    jdbcTemplate.execute("CREATE TABLE test2." + tableName + " LIKE production." + tableName); //Create new table in test2 based on production structure 
} 

這是使用Spring來簡化數據庫連接等,但真正的妙處在於SQL語句。正如D Mac所述,這不會複製外鍵約束,但可以通過運行另一個SQL語句並解析結果來實現。

0

在您的腳本語言中,您要在要複製的數據庫上調用「SHOW TABLES」。讀取結果一次設置一行,程序將表名稱放入一個變量中(我們稱之爲$ tablename),並可以生成sql:「CREATE TABLE test。$ tablename LIKE production。$ tablename」。遍歷結果集並完成。如果你這樣做,你可以運行「SHOW CREATE TABLE $ tablename」並解析結果來挑選出約束條件)。

我沒有爲Java代碼片斷,但這裏是一個你可以當作僞代碼的Perl:在結果中返回數組引用設置

$ref = $dbh->selectall_arrayref("SHOW TABLES"); 
unless(defined ($ref)){ 
     print "Nothing found\n"; 
} else { 
     foreach my $row_ref (@{$ref}){ 
       push(@tables, $row_ref->[0]); 
     } 
} 

foreach語句迭代由數據庫接口庫。 push語句將結果集當前行的第一個元素放入數組變量@tables中。您將使用適合您所選語言的數據庫庫。

+0

如何將表格名稱放入變量中?我正在使用Java。 – ryandlf 2012-03-26 12:57:57

+0

@ryandlf,我編輯了我的答案,在Perl中顯示一段代碼 - 對不起,我不知道java中的數據庫接口庫。 – 2012-03-26 13:04:09