我正在尝试使用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
的循环转储数据库和创建新数据库等选项,如以下问题所示:
但我希望每次添加用户时都避免运行进程,转储数据库以及从那里创建数据库。
任何建议都将受到高度赞赏。
答案 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
将使用约束复制它们。
我对此仍然不太满意,因为我觉得我错过了一些东西......