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;”截断之前,它会受到影响。