【发布时间】: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(),不,它们不会返回相同的值,它是唯一的,因为它代表成功插入数据的第一个生成值;这是每条记录。 -
@JohnathanBarclay MySQL 中没有这样的问题,这是在寻求解决方法,并且此问题与您建议的链接不重复,
-
last_insert_id 类似于 Sql Server 的 SCOPE_IDENTITY。它是每个连接的并且仅限于当前范围(触发器触发后该值会恢复,因此触发器不会影响当前范围内的值,即使它们自己也生成一个 id)。