輕鬆掌握MySQL函數中的last_insert_id()
Mysql關係型資料庫管理系統
MySQL是一個開放式原始碼的小型關聯式資料庫管理系統,開發者為瑞典MySQL AB公司。 MySQL被廣泛地應用在Internet上的中小型網站。由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站資料庫。
相信大家應該都知道Mysql函數可以實現許多我們需要的功能,這篇文章介紹的Mysql函數Last_insert_id()就是其中之一,文章透過一個例子展開來講,應該更有助於大家的理解和學習,有需要的朋友們下面來一起看看吧。
前言
最近有同事問我,為什麼last_insert_id()得到的結果與預期的不一樣呢,於是我就認真的去研究的一下這個參數,下面是關於last_insert_id()的詳細介紹,一起來學習學習吧。
首先,舉個例子
wing@3306>show create table tt; +-------+-----------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------+ | tt | CREATE TABLE `tt` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+-----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) # 没有指定值的时候,last_insert_id()符合预期希望 wing@3306>insert into tt values(); Query OK, 1 row affected (0.00 sec) wing@3306>select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 1 | +------------------+ 1 row in set (0.00 sec) wing@3306>insert into tt values(); Query OK, 1 row affected (0.00 sec) wing@3306>select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 2 | +------------------+ 1 row in set (0.00 sec) # what?不是应该是5么,为什么是第一个插入的值3?last_insert_id开始有一点不符合预期了。。 wing@3306>insert into tt values(),(),(); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 wing@3306>select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 3 | +------------------+ 1 row in set (0.00 sec) wing@3306>insert into tt values(),(),(); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 wing@3306>select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 6 | +------------------+ 1 row in set (0.00 sec) # 纳尼?按照预期不是10么?为什么还是之前的6?last_insert_id()我不懂你啊。。 wing@3306>insert into tt values(10); Query OK, 1 row affected (0.01 sec) wing@3306>select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 6 | +------------------+ 1 row in set (0.00 sec)
其次,研究一下
查閱MySQL官方文檔,真的太重要了。 。 。
官方來源:http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id
官方文件原話:
With no argument, LAST_INSERT_ID() returns a 64-bit value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement.
沒有參數的last_insert_id()傳回的是最近一次針對autoincrement列執行的INSERT語句的第一個自動產生的值。
官方文檔原話:
If you insert multiple rows using a single INSERT statement, LAST_INSERT_ID() returns the value generated for the first inserted row only. The reason for this is to make it possible to reproduce easily the same INSERT statement against some other server.
翻譯:
如果你在單條INSERT語句中插入多個值,那麼last_insert_id()傳回的是該INSERT語句第一個自動產生的值。
然後,剖析一下
請認真閱讀上述翻譯中的黑色字體,牢記last_insert_id()的約束。
為什麼插入指定的值,last_insert_id()就失效了呢?
官方文檔明明說了,是自動產生的值啊,不是你指定的值啊,是由autoincremnt計數器自己產生的才能被last_insert_id()追蹤到哇。 。
為什麼多值插入的時候,顯示的是第一條插入值啊,last不是最後一個值的意思麼啊啊啊。 。
官方文件明明說了,是最近一次的INSERT語句**自動產生的第一個值**哇哇哇。 。
總結
記住last_insert_id()的限制。最近一次INSERT語句在autpincrement欄位上自動產生的第一個值。總結的這句話比翻譯的那句話感覺順口多了==
好了,以上就是這篇文章的全部內容了,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。
