2

我最近问了这个问题。

我有一个包含三个表的关系数据库。第一个包含与第二个相关的 id。第二个包含与第三个相关的 id。第三个包含我所追求的结果。

是否可以通过单个查询来查询第一个表中的 id,它给出了第三个表中与之相关的所有结果?

我选择的解决方案是:

select * from table1 t1 join table2 t2 on t1.t2ref = t2.id join table3 t3 on t2.t3ref = t3.id

添加 where 子句以搜索 table1 中的某些行

其中 t1.field = '值'

我的新问题是:

我意识到我也需要插入三个表。我正在处理的是预订系统。是否可以编写一个在查询三个表后直接插入到三个表中的查询(使用连接?)。

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

4

3 回答 3

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', 'me@somewhere.com', 1);
于 2009-11-12T16:03:24.077 回答
1

您不能使用一个查询插入多个表,您必须将其分解为多个查询。

于 2009-11-12T15:58:37.487 回答
1

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

于 2009-11-12T16:10:11.097 回答