如何使用C#复制MySql数据库模式?

时间:2013-11-26 02:12:16

标签: c# mysql database-schema

我正在尝试使用C#& MySql为了复制一个空表(真的重新创建了Schema)。结构如下所示:

> TableTemplate (schema)
    + Tables
        > FirstTable    (table)
        > second table  (table)
        > ...

> SomeOtherTable
    + Tables
        > ... 

我希望将TableTemplate复制到具有用户名的新架构中。

第一个被遗忘的明显路径是尝试CREATE TABLE @UserName LIKE TableTemplate,迅速了解sql参数应该用于值而不是表名(所有hail jon skeet,再次:How to pass a table as parameter to MySqlCommand?)。

这样我们就可以手动验证用户名,以便构建表名(robert's a prime example)。

接下来,似乎即使CREATE TABLE UserID LIKE TableTemplate;也不起作用(即使是来自MySQL Workbench),因为TableTemplate不是表格。

因此,在创建LIKE架构(在手动验证该字符串之后)或尝试其他架构之后,编写一个将在TableTemplate中为每个表创建一个表UserID的循环转储数据库和创建新数据库等选项,如以下问题所示:

但我希望每次添加用户时都避免运行进程,转储数据库以及从那里创建数据库。

任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

我认为mysqldump会更好。但如果你想在一个过程中做。试试这个。

SELECT
   CONCAT ("CREATE TABLE SomeOtherTable.", 
       TABLE_NAME ," AS SELECT * FROM TableTemplate.", TABLE_NAME
   ) as creation_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'TableTemplate';

输出就像

  

CREATE TABLE SomeOtherTable.tbl_name AS SELECT * FROM TableTemplate.tbl_name;

然后迭代结果并执行CREATE TABLE ....

答案 1 :(得分:1)

使用类似的方式结束,在为表名传递aName的方法中:

using (MySqlCommand cmd = new MySqlCommand(string.Format("CREATE DATABASE {0} ;", aName), connection))
{
    cmd.ExecuteNonQuery();          // Create the database with the given user name

    // Building the sql query that will return a "create table" per table in some_db template DB.
    cmd.CommandText = (string.Format("SELECT CONCAT (\"CREATE TABLE {0}.\", TABLE_NAME ,\" "
                                       + "LIKE some_other_db.\", TABLE_NAME ) as creation_sql "
                                       + "FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'some_db';"
                                    , aName));

    try     // Building the inner tables "create table" sql strings
    {
        using (MySqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
                createInnerTablesList.Add(reader.GetString(0));
        }
    }
    catch (MySqlException mysql_ex) { ... } // handle errors 

    foreach (var sql_insert_query in createInnerTablesList)
    {
        try                         // Insert the tables into the user database
        {
            cmd.CommandText = sql_insert_query;
            cmd.ExecuteNonQuery();
        }
        catch (Exception e) { ... } // handle errors 
    }
} 

与Jungsu一样使用LIKE vs AS的原因是,即使AS将创建表,也不会保留任何约束和键(主键)等)。

使用LIKE将使用约束复制它们。

我对此仍然不太满意,因为我觉得我错过了一些东西......