【问题标题】:How to select last insert id without collision如何选择最后一个插入ID而不发生冲突
【发布时间】:2019-11-26 16:26:22
【问题描述】:

我有一张桌子:

CREATE TABLE MyTable (
  UserID BIGINT NOT NULL AUTO_INCREMENT,
  Name VARCHAR(50) NOT NULL,
  PRIMARY KEY (UserID));

现在我需要插入值并获取该值的最后一个插入键。现在我这样做:

using (MySqlConnection connection = new MySqlConnection(CONNECTION_STRING))
{
    connection.Open();
    string query = $"INSERT INTO MyTable VALUES('Bob');\n" +
                   $"SELECT last_insert_id();";

    MySqlCommand command = new MySqlCommand(query, connection);
    var dataReader = command.ExecuteReaderAsync();
    await dataReader;

    long id = -1;
    while (dataReader.Result.Read())
    {
        string idString = (dataReader.Result as IDataRecord)[0].ToString();
        id = long.Parse(idString);
    }

    return id;
}

但是如果一次会有很多查询呢?是否有可能 2 个同时执行的命令执行 INSERT 查询,然后都通过 last_insert_id() 返回相同的值?如何确保 last_insert_id() 在一个命令中返回与其 INSERT 对应的值?

【问题讨论】:

  • Is it possible that 2 simultaneous commands execute INSERT query and then both return the same value via last_insert_id(),不,它们不会返回相同的值,它是唯一的,因为它代表成功插入数据的第一个生成值;这是每条记录。
  • OUTPUT Clause in MySQL的可能重复
  • @JohnathanBarclay MySQL 中没有这样的问题,这是在寻求解决方法,并且此问题与您建议的链接不重复,
  • last_insert_id 类似于 Sql Server 的 SCOPE_IDENTITY。它是每个连接的并且仅限于当前范围(触发器触发后该值会恢复,因此触发器不会影响当前范围内的值,即使它们自己也生成一个 id)。

标签: c# mysql sql


【解决方案1】:

不,last_insert_id 是在每个连接的基础上维护的,所以如果两个连接同时运行,一个不会得到另一个的插入值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多