【问题标题】:UPDATE foreign key using UPDATE query使用 UPDATE 查询更新外键
【发布时间】:2017-01-29 18:20:44
【问题描述】:

我正在尝试更新作为外键的列,我正在尝试将其设置为“NULL”值,但错误显示“错误 1452:无法添加或更新子行:外键约束失败。”

try
 {  
    con.Open();
    MySqlCommand cmd = new MySqlCommand(
                "UPDATE tblcdsummary 
                    set PersonalInfoID = '" + DBNull.Value.ToString() + 
                    "' WHERE CDID = '" + looplabel2.Text + "'", con);


    cmd.ExecuteNonQuery();
    con.Close();
}
catch (Exception x)
{
    MessageBox.Show(x.Message);
}

【问题讨论】:

标签: c# mysql visual-studio


【解决方案1】:

你知道 DBNull.Value.ToString() 的结果是什么吗?
它是一个空字符串。这意味着,如果这两个表之间存在关系,那么您将尝试根据空字符串将更新的记录与第二个表上的记录相关联。
当然,如果相关表没有主键设置为空字符串的记录,你的更新就会失败。

如果您想将该字段设置为 NULL,请明确写入(不带引号)

MySqlCommand cmd = new MySqlCommand(
            @"UPDATE tblcdsummary 
                set PersonalInfoID = NULL 
                WHERE CDID = @id", con);
cmd.Parameters.Add("@id", MySqlDbType.VarChar).Value = looplabel2.Text; 

当然,这只有在您允许将 NULL 存储在 PersonalInfoID 列中时才有效

附言。我还更改了您的代码以使用参数化查询。这是构建sql命令文本的唯一正确方法。
不要连接字符串。这是一个非常大的错误(搜索Sql Injection

【讨论】:

  • 这确实有帮助,非常感谢,谢谢你的小课。注意:)
【解决方案2】:

您需要先更新该键在其实际表中的值(即使用该键引用的表)

【讨论】:

  • 你的意思是,我必须将主键更新到它所引用的位置?
  • 是的,你需要更新被引用表的主键,因为你给外键的任何值都会被检查是否存在于被引用表的主键中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
相关资源
最近更新 更多