MySQLi 插入 ID

在具有 AUTO_INCREMENT 列的表上檢索由 INSERT 查詢生成的最後一個 ID。

物件導向的風格

$id = $conn->insert_id;

程式風格

$id = mysqli_insert_id($conn);

如果連線上沒有先前的查詢,或者查詢未更新 AUTO_INCREMENT 值,則返回零。

更新行時插入 id

通常,UPDATE 語句不返回插入 ID,因為僅在儲存(或插入)新行時才返回 AUTO_INCREMENT id。更新新 id 的一種方法是使用 INSERT ... ON DUPLICATE KEY UPDATE 語法進行更新。

設定示例如下:

CREATE TABLE iodku (
    id INT AUTO_INCREMENT NOT NULL,
    name VARCHAR(99) NOT NULL,
    misc INT NOT NULL,
    PRIMARY KEY(id),
    UNIQUE(name)
) ENGINE=InnoDB;

INSERT INTO iodku (name, misc)
    VALUES
    ('Leslie', 123),
    ('Sally', 456);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
+----+--------+------+
| `id` | name   | misc |
+----+--------+------+
|  1 | Leslie |  123 |
|  2 | Sally  |  456 |
+----+--------+------+

IODKU 執行更新的情況和 LAST_INSERT_ID() 檢索相關的 id

$sql = "INSERT INTO iodku (name, misc)
    VALUES
    ('Sally', 3333)            -- should update
    ON DUPLICATE KEY UPDATE    -- `name` will trigger "duplicate key"
    id = LAST_INSERT_ID(id),
    misc = VALUES(misc)";
$conn->query($sql);
$id = $conn->insert_id;        -- picking up existing value (2)

IODKU 執行插入LAST_INSERT_ID() 檢索新 id 的情況:

$sql = "INSERT INTO iodku (name, misc)
    VALUES
    ('Dana', 789)            -- Should insert
    ON DUPLICATE KEY UPDATE
    id = LAST_INSERT_ID(id),
    misc = VALUES(misc);
$conn->query($sql);
$id = $conn->insert_id;      -- picking up new value (3)

結果表內容:

SELECT * FROM iodku;
+----+--------+------+
| `id` | name   | misc |
+----+--------+------+
|  1 | Leslie |  123 |
|  2 | Sally  | 3333 |  -- IODKU changed this
|  3 | Dana   |  789 |  -- IODKU added this
+----+--------+------+