[英]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.