繁体   English   中英

获取最后一次插入如果该行已存在,则返回0

[英]Get last inserted Id returns 0 if the row already exists

我用的时候:

START TRANSACTION;
INSERT IGNORE INTO users (Name, ...) VALUES ('user1',..) ON DUPLICATE KEY UPDATE lastSeen=NOW();
SELECT LAST_INSERT_ID();
COMMIT;

当我从我的SQL客户端运行此查询时,我按预期获得最后插入的ID。

但是如果用户已经存在怎么办?(table uniquness)。 所以没有创建新的id。 但是现在当我从我的SQL客户端运行相同的查询时,仍然按预期获得了id

但! 当我从我的C#代码运行它并使用mysql.reader查询结果时我收到0 这是为什么??

如果不使用SELECT LAST_INSERT_ID()我使用SELECT id FROM users ORDER BY id DESC LIMIT 1我再次得到正确的id。

编辑!

这与建议的主题不重复。 在那个主题中答案说自动递增不是主键,这不是我的情况! 另外,当我使用mysql客户端时,它确实返回正确的id! 只有当我从我的c#代码运行它时才会出现问题!

我的C#代码:

using (var conn = new MySqlConnection(connString))
{
    try
    {
        conn.Open();
        var command = conn.CreateCommand();
        command.CommandText = strSQL;
        MySqlDataReader reader;
        string result = "";
        try
        {
            reader = command.ExecuteReader();

            if (reader.Read())
                result = reader[0].ToString();
        }
        catch (Exception ex)
        {
            throw new MySqlException("SQL Error: " + ex.ToString());
        }
        reader.Close();
        return result;
    }
}

我找到了一个解决方法,简单的CASE子句完成了这项工作:

START TRANSACTION;
INSERT IGNORE INTO users (Name, ...) VALUES ('user1',..) ON DUPLICATE KEY UPDATE lastSeen=NOW();
SELECT CASE WHEN LAST_INSERT_ID()=0 THEN (SELECT id FROM users WHERE Name = 'user1') ELSE LAST_INSERT_ID() END;
COMMIT;

现在万一用户存在,我们只是查询id,如果它不存在, LAST_INSERT_ID()会给我们正确的id

从我在那里读到https://stackoverflow.com/a/15057619/4421474

您的代码可以转换为:

using (var conn = new MySqlConnection(connString))
{
   conn.Open();
   var command = conn.CreateCommand();
   command.CommandText = strSQL; <--  just insert part like "START ... INSERT ... COMMIT;"
   command.ExecuteNonQuery();
   string result = command.LastInsertedId;
   return result;
}

对不起,我不是c#expert,因此可能会破坏某些语法。

我想这个答案:

对于这个问题我只需要50美分,我只是注意到如果你的表没有将AUTO_INCREMENT设置为索引,你将不会得到大于0的LAST_INSERT_ID

我在这里找到MySQL:LAST_INSERT_ID()返回0是好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM