如何在mysql或JDBC中的表中自动插入外键引用?

时间:2014-09-18 18:51:11

标签: mysql jdbc foreign-keys triggers

我正在使用MySQL。我的问题是如何自动将新添加的行插入外键表。一个例子将澄清我的问题:

我有两个表Employee和Salary:

CREATE TABLE Employee(
     emp_id int NOT NULL AUTO_INCREMENT,
     name char(30),
     PRIMARY KEY (emp_id)
)  ENGINE=innoDB;

CREATE TABLE salary {
       sal_id int NOT NULL AUTO_INCREMENT
       salary_figure int,
       emp_id int,
       PRIMARY KEY (sal_id),
       FOREIGN KEY REFERENCES Employee(emp_id)
}

这是联接表:

employee_salary_join Table {
    int sal_id,
    int emp_id
}

上面的连接表没有任何外键关系。

现在,当我将员工插入员工表

INSERT into Employee values ("john")

执行此语句后,在Employee表中创建一行,该行具有由数据库引擎分配的pk。

现在,当我在员工表中为员工John插入一行时,如下所示:

INSERT into SALARY values ("30000", ?????)

如何获取上面John插入的行的员工ID,并将其放在?????

的位置

最后,我有一个连接表,每次在工资表中添加一行时,我想要连接表中的相应条目。这可以通过触发器来完成,但我并不完全清楚如何设置它,因为我需要对连接表行引用emp_idsal_id

我还想了解处理外键插入时的最佳做法。我正在使用JDBC / mysql驱动程序。我想这不应该影响我们在sql语句中处理上述过程的方式。

2 个答案:

答案 0 :(得分:6)

使用函数LAST_INSERT_ID获取插入行的auto_increment列的此ID: 所以你可以使用

INSERT into SALARY (salary_figure, emp_id) values ("30000", LAST_INSERT_ID());

进行第二次INSERT操作。

如果要通过触发器将行添加到第三个表中,使用新的sal_idemp_id值,可以使用Salary上的AFTER INSERT触发器执行此操作表使用emp_id列中的新值和最后插入的auto_increment id ...已经提到过LAST_INSERT_ID()函数。

CREATE TRIGGER salary_after_insert AFTER INSERT ON `SALARY` 
    FOR EACH ROW
    BEGIN
         INSERT INTO join_table (emp_id, sal_id) VALUES (NEW.emp_id, LAST_INSERT_ID());
    END;

答案 1 :(得分:0)

我使用此代码并正常工作

 try 
        { 
        SqlCommand comm = new SqlCommand("Insert into tbl_sale(Terminal_NO, Date, Sale_Type, Fuel_Type, Unit) values('"+ddl_terminal.SelectedItem+"','"+dt_sales.Value.Date+"', '"+ddl_SaleType.SelectedItem+"', '"+ddl_FuelType.SelectedItem+"', '"+ddl_unit.SelectedItem+"')",conn);
SqlCommand com = new SqlCommand("Insert into tbl_saleDetails(Sale_ID, Unit_Sold, Amount_per_Liter) values((Select Sale_ID from tbl_sale where Sale_ID = (Select MAX(Sale_ID) from tbl_sale)),'" + txt_Cash_Unit_Sold.Text + "','" + txt_Cash_Amount_per_liter.Text + "')", conn);
        conn.Open();
        comm.ExecuteNonQuery();
        com.ExecuteNonQuery();
        conn.Close();
            MessageBox.Show("Data Saved Successfully!");
            }
        catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }