【发布时间】:2014-09-18 18:51:11
【问题描述】:
我正在使用 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 并将其放置在 ????? 的位置
最后,我有一个连接表,每次在salary表中添加一行,我都想要连接表中的相应条目。这可以通过触发器来完成,但我并不完全清楚如何设置它,因为我需要为连接表行引用 emp_id 和 sal_id。
我还想了解这里处理外键插入时的最佳做法。我正在使用 JDBC/mysql 驱动程序。我想这应该不会影响我们如何在 sql 语句中处理上述内容。
【问题讨论】:
-
@MarkRotteveel:该链接有助于澄清第一部分。关于获取连接表 id 的第二部分,JDBC 中有没有一种方法可以自动插入。或者在数据库端需要一个触发器。如果是这样,要使触发器起作用,需要知道两个表中两行的 id
-
这是您应该坚持关于 SO 的一个特定问题的原因之一。但是,MySQL 有触发器,你可以从插入的记录中获取值插入到另一个表中,参见dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html(具体示例见文末)
-
顺便说一句:我不清楚你为什么需要那个“连接表”;鉴于薪水表已经包含员工 ID,因此没有必要。
-
@MarkRotteveel:我同意这里没有必要。但我的目的是提供一个例子来说明我的观点。而且我不确定触发器是否是获取连接表插入的最佳实践,或者在 JDBC 级别执行是否更好(在这种情况下,您可以回滚并适当地处理它)
标签: mysql jdbc foreign-keys triggers