You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access插入用户记录提示tbl_routines需关联记录报错如何解决

修复方案

报错原因

这个报错是外键参照完整性约束触发导致的,你虽然设置了routine_id字段非必填,但大概率踩了两个Access的常见坑:

  1. tbl_users的routine_id字段默认值被设为了0,你插入数据时没有给这个字段赋值,数据库自动填了0,但tbl_routines表中没有id=0的记录,直接触发约束报错
  2. 你两表之间的1对多关系开启了强制参照完整性,部分版本的Access默认不允许外键字段留空,哪怕你设了非必填也没用。

操作步骤

1. 调整数据库配置

首先打开Access数据库做两处修改:

  • 打开tbl_users的设计视图,找到routine_id字段,把「必填」设为「否」,「默认值」那一栏直接清空,不要留任何内容。
  • 打开数据库的关系界面,双击tbl_routines和tbl_users之间的连线:
    • 如果你不需要严格校验后续routine_id的合法性,直接取消勾选「实施参照完整性」,保存即可。
    • 如果你需要保留校验逻辑,只要保证上面的字段设置正确,留空是符合约束要求的,不用关参照完整性。

2. 优化插入代码(强烈建议改)

你现在的SQL是字符串拼接的,很容易被SQL注入攻击,而且可以显式指定插入空的routine_id,彻底避免默认值的问题,修改后的代码如下:

if (txtRegPass.Text == txtRegPassConf.Text)
{
    con.Open();
    // 显式指定routine_id字段,避免默认值干扰
    string register = "INSERT INTO tbl_users (username, [password], routine_id) VALUES (?, ?, ?)"; 
    cmd = new OleDbCommand(register, con);
    // 用参数化传值,杜绝SQL注入风险
    cmd.Parameters.AddWithValue("@username", txtRegUser.Text);
    cmd.Parameters.AddWithValue("@password", txtRegPass.Text);
    cmd.Parameters.AddWithValue("@routine_id", DBNull.Value); // 显式插入空值
    cmd.ExecuteNonQuery(); 
    con.Close();

    MessageBox.Show("账号创建成功", "注册成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
    txtRegUser.Text = "";
    txtRegPass.Text = "";
    txtRegPassConf.Text = ""; 
}
else
{
    MessageBox.Show("两次输入的密码不一致", "注册失败", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    txtRegPass.Text = "";
    txtRegPassConf.Text = ""; 
}

内容的提问来源于stack exchange,提问作者Cyro1_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:15:01