繁体   English   中英

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

[英]How to copy a MySql database schema using C#?

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

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

> SomeOtherTable
    + Tables
        > ... 

我想要的是将TableTemplate复制到一个具有用户名的新Schema。

第一个被遗忘的明显路径是尝试CREATE TABLE @UserName LIKE TableTemplate ,迅速了解sql参数应该用于值而不是表名(所有hail jon skeet,再次: 如何将表作为参数传递给MySqlCommand? ) 。

因此,我们需要手动验证用户名以构建表名( robert是一个主要的例子 )。

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

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

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

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

我认为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 ....

结束使用类似的东西,在为表名传递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将使用约束复制它们。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM