C# MySqlCommand 设置 foreign_key_checks = 0
C# MySqlCommand to SET foreign_key_checks = 0
我想截断通过外键约束引用的 table。
private int clean_table(string table)
{
try
{
using (MySqlConnection conn = new MySqlConnection(CadConexion))
{
conn.Open();
String sql = "TRUNCATE TABLE mydb." + table;
using (MySqlCommand comm = new MySqlCommand(sql, conn))
{
comm.ExecuteNonQuery();
}
conn.Close();
}
}
catch (Exception e)
{
log.Error("clean_table " + e.Message);
return 0;
}
return 1;
}
这将 return:
无法截断外键约束中引用的 table
所以,在 mySql 中,我会用以下方法解决它:
设置FOREIGN_KEY_CHECKS=0
但是 运行 MySqlCommand 似乎无法正常工作。
String sql = "SET FOREIGN_KEY_CHECKS=0";
using (MySqlCommand comm = new MySqlCommand(sql, conn))
{
comm.ExecuteNonQuery();
}
我检查它:
SELECT @@GLOBAL.foreign_key_checks, @@SESSION.foreign_key_checks;
我怎样才能达到相同的结果?
P.D:我知道我可以找到一种解决方法,即制作带有键约束的 tables 的副本并删除它们,然后再恢复它们,删除键约束并恢复它们等等,但是我宁愿让它简单。另外删除 table 而不是截断也不是一个选项,因为它会删除级联上其他 table 的注册表,我需要备份恢复它们。
好的,我找到了一个似乎可行的方法:
private int clean_table(string table)
{
try
{
using (MySqlConnection conn = new MySqlConnection(CadConexion))
{
conn.Open();
String sql = "SET FOREIGN_KEY_CHECKS=0; TRUNCATE TABLE mydb." + table;
using (MySqlCommand comm = new MySqlCommand(sql, conn))
{
comm.ExecuteNonQuery();
}
conn.Close();
}
}
catch (Exception e)
{
log.Error("clean_table " + e.Message);
return 0;
}
return 1;
}
似乎每次打开连接时,您都在设置一个新会话,因此如果您在单独的连接中使用这两个查询,它将不起作用。
如果加上“SET FOREIGN_KEY_CHECKS=0;”截断之前,它会受到影响。
我想截断通过外键约束引用的 table。
private int clean_table(string table)
{
try
{
using (MySqlConnection conn = new MySqlConnection(CadConexion))
{
conn.Open();
String sql = "TRUNCATE TABLE mydb." + table;
using (MySqlCommand comm = new MySqlCommand(sql, conn))
{
comm.ExecuteNonQuery();
}
conn.Close();
}
}
catch (Exception e)
{
log.Error("clean_table " + e.Message);
return 0;
}
return 1;
}
这将 return:
无法截断外键约束中引用的 table
所以,在 mySql 中,我会用以下方法解决它:
设置FOREIGN_KEY_CHECKS=0
但是 运行 MySqlCommand 似乎无法正常工作。
String sql = "SET FOREIGN_KEY_CHECKS=0";
using (MySqlCommand comm = new MySqlCommand(sql, conn))
{
comm.ExecuteNonQuery();
}
我检查它:
SELECT @@GLOBAL.foreign_key_checks, @@SESSION.foreign_key_checks;
我怎样才能达到相同的结果?
P.D:我知道我可以找到一种解决方法,即制作带有键约束的 tables 的副本并删除它们,然后再恢复它们,删除键约束并恢复它们等等,但是我宁愿让它简单。另外删除 table 而不是截断也不是一个选项,因为它会删除级联上其他 table 的注册表,我需要备份恢复它们。
好的,我找到了一个似乎可行的方法:
private int clean_table(string table)
{
try
{
using (MySqlConnection conn = new MySqlConnection(CadConexion))
{
conn.Open();
String sql = "SET FOREIGN_KEY_CHECKS=0; TRUNCATE TABLE mydb." + table;
using (MySqlCommand comm = new MySqlCommand(sql, conn))
{
comm.ExecuteNonQuery();
}
conn.Close();
}
}
catch (Exception e)
{
log.Error("clean_table " + e.Message);
return 0;
}
return 1;
}
似乎每次打开连接时,您都在设置一个新会话,因此如果您在单独的连接中使用这两个查询,它将不起作用。
如果加上“SET FOREIGN_KEY_CHECKS=0;”截断之前,它会受到影响。