last_insert_id()函數是適用於id為自動生成的表
下面是插入表數據時last_insert_id()函數的兩種用法:
表結構:


此表使用last_insert_id()函數的字段為parentId(父節點);
parentId取值特點:
1)levelId節點為'0'時parentId為空;
2)levelId節點為'1'時parentId取levelId節點為'0'數據的autoId;
3)levelId節點為'2'時parentId取levelId節點為'1'數據的autoId;
1、插入的數據是逐條插入
如:
INSERT INTO sn_app_label (app_code, apply_id, apply_name, level_id, parent_id , state, operation_time) VALUES ('SNSC', 'G001', '門店屬性標簽', '0', '' , '0', '2018-06-15 00:00:00'); INSERT INTO sn_app_label (app_code, apply_id, apply_name, level_id, parent_id , state, operation_time) VALUES ('SNSC', '001', '門店類型', '1', (SELECT LAST_INSERT_ID()) , '0', '2018-06-15 00:00:00'); INSERT INTO sn_app_label (app_code, apply_id, apply_name, level_id, parent_id , state, operation_time) VALUES ('SNSC', '1', '門店類型', '2', (SELECT LAST_INSERT_ID()) , '0', '2018-06-15 00:00:00'); INSERT INTO sn_app_label (app_code, apply_id, apply_name, level_id, parent_id , state, operation_time) VALUES ('SNSC', '2', '門店類型', '2', (SELECT a.parent_id FROM (SELECT parent_id FROM sn_app_label WHERE app_code = 'SNSC' AND auto_id in (SELECT LAST_INSERT_ID())) a) , '0', '2018-06-15 00:00:00');
上面sql可以看到:第一條數據level_id節點為'0',parent_id為空;第二條數據level_id節點為'1',此時parent_id應為第一條數據的auto_id,直接使用sql:select last_insert_id()查詢上一條數據的auto_id;第三條數據同第二條;有sql可以看出第四條數據和第三條數據是在同一節點,使用select last_insert_id()查出第三條數據auto_id,再根據auto_id查詢第三條的parent_id即可,因為第四條和第三條的parent_id值是一致的。select last_insert_id()查詢i結果是集合,故在使用select last_insert_id()結果當做查詢條件時使用in()。
上述sql執行結果為:

2、批量插入
如:
INSERT INTO sn_app_label (app_code, apply_id, apply_name, level_id, parent_id , state, operation_time) VALUES ('SNSC', 'G001', '門店屬性標簽', '0', '' , '0', '2018-06-15 00:00:00'), ('SNSC', '001', '門店類型', '1', (SELECT LAST_INSERT_ID()) , '0', '2018-06-15 00:00:00'), ('SNSC', '1', '門店類型', '2', (SELECT LAST_INSERT_ID()) , '0', '2018-06-15 00:00:00'), ('SNSC', '2', '門店類型', '2', (SELECT a.parent_id FROM (SELECT parent_id FROM sn_app_label WHERE app_code = 'SNSC' AND auto_id in (SELECT LAST_INSERT_ID())) a) , '0', '2018-06-15 00:00:00');
sql執行結果:

有執行結果可以看出:select last_insert_id()的結果為之前插入最后一條數據的auto_id,所以第6、7行中parent_id顯示的是第四行的auto_id,第8行的parent_id為第四行中的parent_id。
總結:id為自動生成的表;多條語句插入時last_insert_id()獲取的是最近一次insert的auto_id;一條語句插入多個值時last_insert_id()獲取的也是最近一次insert的auto_id,而不是該批量插入的最近一次intert的auto_id。
