Back

mysql - 使用 last_insert_id 来查询最后插入的id (基于connection是准确的)

发布时间: 2020-05-19 04:24:00

参考:https://blog.csdn.net/hsd2012/article/details/51464409

在rust的持久层框架diesel中,insert操作仅支持postgres, 会返回id.  对于  mysql 与 sqlite都不支持。

所以我们需要用对应的办法。

使用 last_insert_id 是可以的。 在高并发操作下是准确的。

查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是不可预料的

下面是 翱翔同学提供的例子: ( rust 例子)

async fn create_user(
    db_pool: &MySqlPool,
    name: &str,
    datetime: chrono::NaiveDateTime,
) -> u32 {
    // BEGIN transaction
    let mut transaction = db_pool.begin().await.unwrap();
    mysql::query(
        "INSERT INTO users \
        (name, created_at, updated_at) \
        VALUES (?, ?, ?);",
    )   
    .bind(name)
    .bind(datetime)
    .bind(datetime)
    .execute(&mut transaction)
    .await
    .unwrap();
    // COMMIT transaction

    // 获取刚刚在事务处理中创建了user的MySqlConnection
    let mut db_conn = transaction.commit().await.unwrap();
    let last_insert_user_id = sqlx::query_as::<_, (u32,)>("SELECT LAST_INSERT_ID();")
        .fetch_one(&mut db_conn)
        .await
        .unwrap()
        .0; 
    // 这里已经在函数的结尾处了,就懒得手动释放内存了
    // drop(db_conn);
    debug_assert_ne!(last_insert_user_id, 0); 
    last_insert_user_id
}

Back