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
+----+--------+------+