2009-11-12 77 views
2

我最近问了this的问题。mySQL - 插入三张表

我有三个表的关系数据库。第一个containts id的 与第二个有关。第二个 包含与第三个 相关的标识。第三个包含我之后的结果 。

是否有可能在第一表, 给出了第三个表 所有结果的单一查询 查询一个id,涉及到了吗?

我的选择的解决方案是:

SELECT * FROM T1表1表2加入T2 上t1.t2ref = t2.id加入表3 T3上 t2.t3ref = t3.id

添加where子句在表1

其中t1.field = '值'

搜索 某些行

我的新问题是:

我已经意识到我需要插入三个表了。我正在处理的是预订系统。是否有可能编写一个查询,在查询它们后直接插入到三个表中(使用连接?)。

我还有另外一个考虑因素是我应该使用事务来确保两个查询同时运行......都发现这个ID是'未预留的',然后导致一个双重预订或者有一个更简单的办法?

回答

8

你应该在交易中做三个插入。我可能会写一个存储过程来处理插入。

编辑:

这是一个存储过程与事务的例子。请注意使用LAST_INSERT_ID()获取先前插入的记录的ID。这只是两个表格,但您应该可以将其扩展到三个表格。

DELIMITER // 
CREATE PROCEDURE new_engineer_with_task(
    first CHAR(35), last CHAR(35), email CHAR(255), tool_id INT) 
BEGIN 
START TRANSACTION; 
    INSERT INTO engineers (firstname, lastname, email) 
    VALUES(first, last, email); 

    INSERT INTO tasks (engineer_id, tool_id) 
    VALUES(LAST_INSERT_ID(), tool_id); 
COMMIT; 
END// 
DELIMITER ; 

而且你怎么称呼它,像这样:

CALL new_engineer_with_task('Jerry', 'Fernholz', '[email protected]', 1); 
+0

对不起,我从来没有使用过交易之前..如何编写存储过程? – Mark

+0

@Mark您可以使用MySQL Workbench并双击'Add Routine',或者您可以使用CLI'mysql -u [username] -p [database name]',然后输入Jerry写的代码。 – Ben

1

无法用一个查询插入到多个表中,您必须将其分解为多个查询。

1

你总是执行多个更新时使用事务。如果一次更新失败,您将希望回滚先前的成功更新,以便不违反关系模型的任何未受限制的约束。

+0

我必须使用InnoDB来使用交易吗? – Mark

+1

是的。或者我认为MySQL正在放弃支持的BDB。 InnoDB提供了完整的ACID合规性,这正是您所需要的。 –