任务是修改(重写)记录的值,如果存在,如果这样的记录不存在,那么添加这样的记录
我正在寻找最简单、最快和最正确的方法来做到这一点。
下面是一个使用C#代码解决此问题的错误示例,其中我在尝试添加记录时截获了一个错误(我使用 nick 作为主键,因此存在具有此类值的记录时会发生错误)
// добавление
try
{
sqlCmd.CommandText = "INSERT INTO Money ('nick', 'money') values ('StriBog45' , '300')";
sqlCmd.ExecuteNonQuery();
}
catch (SQLiteException ex)
{
Console.WriteLine("Error: " + ex.Message);
// модификация
try
{
sqlCmd.CommandText = "UPDATE Money SET money = 600 WHERE nick = 'StriBog45'; ";
sqlCmd.ExecuteNonQuery();
}
catch (SQLiteException xex)
{
Console.WriteLine("Error: " + xex.Message);
}
有一个想法可以通过 SQL 命令中的 if else 来完成,但是随后执行了对存在的额外搜索,这可能会减慢工作速度,例如
if(exists(nick = 'StriBog45'))
UPDATE Money SET money = 600 WHERE nick = 'StriBog45'
Else
INSERT INTO Money ('nick', 'money') values ('StriBog45' , '300')
毕竟,团队Insert into检查了主键的重复,这意味着它本身已经使用了存在的外表,在我看来,这可以以某种方式使用
在Stackoverflow 中我找到了这样一个选项,但是它需要引入额外的变量并且非常庞大
$res = mysql_query('select count(*) FROM table WHERE id = 1') or die();
$row = mysql_fetch_row($res);
if ($row[0] > 0)
{
// Есть данные
}
else
{
// нет данных
}
对于 SQLite,如果版本是 3.24.0 或更高版本,则可以使用特殊的 UPSERT 语法:
对于早期版本,您可以使用以下构造:
mysql 有一个方便的东西,叫做 INSERT ON DUPLICATE KEY UPDATE - 正是你想要的。sqlite从 3.24.0 版本开始就有了。
您可以在文档中阅读更多内容,语法有一些差异:
这里的选项很少,要么检查记录的存在并相应地执行 INSERT/UPDATE,要么使用 REPLACE,但随后您将覆盖所有数据,这可能不是很好。