MySQL两个表格怎么能关联一起

问题遇到的现象和发生背景

img


各位可以看一下,一个C#中的一个窗体里面是两个部分,基本信息和教育经历。基本信息在MySQL中对应的是emp_info表那么教育经历对应的是emp_list表格,我现在是要求在增加和修改的时候一起把数据上传到MySQL中,现在我遇到的问题是两个表都有主键而教育经历不可能有一个教育经历肯定是多个,现在怎么办

问题相关代码,请勿粘贴截图

MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DemoPlus
{
public partial class w_pop_empinfo : Form
{
private string empIndex = "";

    public w_pop_empinfo()
    {
        InitializeComponent();
    }

    public w_pop_empinfo(string index) : this()
    {
        this.empIndex = index;
        string sql = string.Format("select * from emp_info where emp_code={0}", index);
        var table = MySql.GetInstance().ExecuteQuery(sql);
        if (table.Rows.Count > 0)
        {
            tb_code.Text = index;
            tb_name.Text = table.Rows[0]["emp_name"].ToString();
            tb_idcard.Text = table.Rows[0]["emp_idcard"].ToString();
            tb_sex.Text = table.Rows[0]["emp_sex"].ToString();
            tb_birthday.Text = table.Rows[0]["emp_birthday"].ToString();
            tb_age.Text = table.Rows[0]["emp_age"].ToString();
            tb_address.Text = table.Rows[0]["emp_address"].ToString();
            tb_tel.Text = table.Rows[0]["emp_tel"].ToString();
            tb_work.Text = table.Rows[0]["emp_work"].ToString();
        }

        sql = string.Format("select * from emp_list where emp_code={0}", index);
        table = MySql.GetInstance().ExecuteQuery(sql);
        foreach (DataRow row in table.Rows)
        {
            var rowIndex = dgvEduExper.Rows.Add();
            dgvEduExper.Rows[rowIndex].Cells["StartTime"].Value = row["date_begin"].ToString();
            dgvEduExper.Rows[rowIndex].Cells["EndTime"].Value = row["date_end"].ToString();
            dgvEduExper.Rows[rowIndex].Cells["EduCompany"].Value = row["emp_edu"].ToString();
            dgvEduExper.Rows[rowIndex].Cells["EduBack"].Value = row["emp_degree"].ToString();
            dgvEduExper.Rows[rowIndex].Cells["BackUp"].Value = row["emp_memo"].ToString();
        }
    }

    private void label4_Click(object sender, EventArgs e)
    {

    }

    private void cb_add_Click(object sender, EventArgs e)
    {
        var index = dgvEduExper.Rows.Add();
    }

    private void cb_cancel_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void w_pop_empinfo_Load(object sender, EventArgs e)
    {
    }

    private void cb_ok_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(tb_code.Text.Trim()))
        {
            MessageBox.Show("人员代码不能为空");
            return;
        }
        if (string.IsNullOrEmpty(tb_name.Text.Trim()))
        {
            MessageBox.Show("人姓名不能为空");
            return;
        }
        if (string.IsNullOrEmpty(tb_birthday.Text.Trim()))
        {
            MessageBox.Show("出生日期不能为空");
            return;
        }
        var sql = String.Format("update emp_info set emp_name='{1}',emp_idcard='{2}',emp_sex='{3}'," +
            "emp_birthday='{4}',emp_age='{5}',emp_address='{6}',emp_tel='{7}',emp_work='{8}' where emp_code='{0}';", tb_code.Text, tb_name.Text,
             tb_idcard.Text, tb_sex.Text, tb_birthday.Text, tb_age.Text, tb_address.Text, tb_tel.Text, tb_work.Text);
        int result = MySql.GetInstance().ExecuteNoQuery(sql);
        //sql = "";

        foreach (DataGridViewRow row in dgvEduExper.Rows)
        {
            sql += string.Format(@"insert into emp_list(emp_code,date_begin,date_end,emp_edu,emp_degree,emp_memo)
                   values('{0}','{1}','{2}','{3}','{4}','{5}');", tb_code.Text.Trim(), row.Cells["StartTime"].Value.ToString(),
                row.Cells["EndTime"].Value.ToString(), row.Cells["EduCompany"].Value.ToString(), row.Cells["EduBack"].Value.ToString(), row.Cells["BackUp"].Value.ToString());
        }
        result = MySql.GetInstance().ExecuteNoQuery(sql);
        int m = (dgvEduExper.RowCount + 1) - result;
        if (m == 0)
        {
            MessageBox.Show("修改成功");
        }
        else if (result <= 0)
        {
            MessageBox.Show("修改失败");
        }
        else
        {
            MessageBox.Show("部分修改成功");
        }
        // Application.Restart();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var sql = String.Format("insert into emp_info (emp_code,emp_name,emp_idcard,emp_sex,emp_birthday,emp_age,emp_address,emp_tel,emp_work) value ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')", tb_code.Text, tb_name.Text, tb_idcard.Text, tb_sex.Text, tb_birthday.Text, tb_age.Text, tb_address.Text, tb_tel.Text, tb_work.Text);
        if (dgvEduExper.SelectedRows.Count > 0)
        {
            var index = dgvEduExper.CurrentRow.Index;
            dgvEduExper.Rows.Insert(index);
        }
    }
}

}

运行结果及报错内容
我的解答思路和尝试过的方法

我尝试在教育经历的备注里面存放基本信息的主键,但是没有成功

我想要达到的结果

不知道怎么办了,只要能让在增加的时候把基本信息和教育经历一起增加上mysql就行,或者在修改的时候单加教育经历然后上传MySQL也可以

首先,放备注里可不是个好办法,那样虽然存进去了,过后不好通过它进行筛选
你的主从表里,从表通过外键与主表关联,那么外键的字段类型应该与主表主键字段类型一致,这样保证数据也一致
过后也方便用left join等方式进行多表联合查询
至于如何拿到主表的主键
因为你主表主键是自动增长的
所以肯定不能同时插入,而且你也没法同时插入,插入总是有先后顺序的
你先插入主表数据,然后以名字作为关键字进行查询,取主键最大的那一条数据就是你刚刚插入的数据,再把它作为从表的外键插入从表数据即可
或者你的主表主键不再依赖mysql数据库的自增,而是统一使用GUID、UUID之类可以保证唯一的字符串,然后你统一生成一个字符串作为主表的主键和从表的外键