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

bra*_*orm 6 mysql triggers jdbc foreign-keys

我正在使用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)
}
Run Code Online (Sandbox Code Playgroud)

这是连接表:

employee_salary_join Table {
    int sal_id,
    int emp_id
}
Run Code Online (Sandbox Code Playgroud)

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

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

INSERT into Employee values ("john")
Run Code Online (Sandbox Code Playgroud)

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

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

INSERT into SALARY values ("30000", ?????)
Run Code Online (Sandbox Code Playgroud)

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

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

我还想了解处理外键插入时的最佳实践.我正在使用JDBC/mysql驱动程序.我想这不应该影响我们在sql语句中如何处理上面的过程.

VMa*_*Mai 6

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

INSERT into SALARY (salary_figure, emp_id) values ("30000", LAST_INSERT_ID());
Run Code Online (Sandbox Code Playgroud)

为您的第二次INSERT操作.

如果要通过触发器将行添加到第三个表中,使用new sal_idemp_idvalues,可以Salary使用emp_id列中的新值和最后插入的auto_increment id,使用表上的AFTER INSERT触发器执行此操作...已经提到过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;
Run Code Online (Sandbox Code Playgroud)

  • @brainstorm简单地说:`LAST_INSERT_ID()`返回会话中最后生成的id.因此,如果`INSERT`生成了一个id,那么将返回该id(假设您不在其中执行其他插入).但是,它不是获取生成密钥的"JDBC"方式,请参阅http://stackoverflow.com/questions/1915166/how-to-get-the-insert-id-in-jdbc/1915197 (2认同)