2012-11-09 81 views
0

在幻灯片http://www.slideshare.net/billkarwin/models-for-hierarchical-data,我看到了一个SQL代码(第22页):SQL查询优化

INSERT INTO Comments (author, comment) 
VALUES (‘Ollie’, ‘Good job!’); 

SELECT path FROM Comments 
WHERE comment_id = 7; 

UPDATE Comments 
SET path = $parent_path || LAST_INSERT_ID() || ‘/’ 
WHERE comment_id = LAST_INSERT_ID(); 

我认为我们可以优化它:

SELECT path FROM Comments 
WHERE comment_id = 7; 

INSERT INTO Comments (author, comment, path) 
VALUES (‘Ollie’, ‘Good job!’, $parent_path || LAST_INSERT_ID() || ‘/’); 

我说得对不对?

+0

插入中LAST_INSERT_ID()的值是多少? – Glenn

+0

我认为插入语句的ID。看看幻灯片。 –

+0

但是在优化语句中没有以前的插入语句,只有一个select语句。 – Glenn

回答

2

是的,单个插入会比插入后跟更新更好,但是在这种情况下,自动生成的id(?)也被用作列值。路径中使用的LAST_INSERT_ID()不是正在执行的当前插入语句的标识,而是最后一个(前一个)插入的标识。

+0

是否有任何sql函数INSERT_ID_OF_THIS_INSERT()? –

+1

嗯,将id用作另一列值的一部分有点不同寻常。更典型的是捕获返回的id并将其用于插入子记录(ex插入订单,使用返回的order_id插入到order_details表中)。或者创建一个存储过程来处理这种东西。 – Glenn

+0

+1给Glenn,如果使用LAST_INSERT_ID(),则必须先执行INSERT,然后形成路径。 MySQL中没有INSERT_ID_OF_THIS_INSERT()函数。您甚至不能编写触发器来编辑路径列,因为直到* after *触发器后才会生成新的ID,因为修改列内容为时已晚。 (PS:我是OP链接到的幻灯片的作者。) –