在插入或更新之前检查行是否存在

4
public static void StoreGrid(ICAUploadDAO result)
{
      string queryString = "INSERT INTO Result (ModuleGrp, PEM, AdmNo, Name, ICA1, ICA2, ICA3, ICA4, ModuleCode) values ('" + @result.ModuleGrp + "','" + @result.PEM + "','" + @result.AdmNo + "','" + @result.Name + "','" + @result.ICA1 + "','" + @result.ICA2 + "','" + @result.ICA3 + "','" + @result.ICA4 + "','" + @result.ModuleCode + "')";

      string connectionString = Properties.Settings.Default.DBConnection;
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
            SqlCommand command = new SqlCommand(queryString, connection);
            connection.Open();
            command.ExecuteNonQuery();
      }
}

在插入数据之前,我想检查行是否已经存在,如果已经存在,则更新它。如果有人能够帮助我解决这个问题,我将非常感激,因为我不知道如何处理它。非常感谢。


你认为记录存在的字段是哪些字段? - kostas ch.
3
你应该始终使用参数化查询。这种字符串拼接容易受到SQL注入攻击 - Soner Gönül
你可以通过C#代码或SQL来实现这个。 - kostas ch.
3个回答

4

只需使用REPLACE INTO而不是INSERT INTO。但是,您必须为您认为使记录相同的字段组合创建唯一索引。

不幸的是,并非所有数据库都支持REPLACE INTO,但MySQLSQLite支持。


3

我之前也遇到了同样的问题。这是我找到的解决方案: http://remy.supertext.ch/2010/11/mysqlupdate-and-insert-if-not-exists/

INSERT INTO wp_postmeta (post_id, meta_key) SELECT ?id, ‘page_title’  FROM DUAL WHERE NOT EXISTS (SELECT meta_id FROM wp_postmeta WHERE post_id = ?id AND meta_key = ‘page_title’);
UPDATE wp_postmeta SET meta_value = ?page_title WHERE post_id = ?id AND meta_key = ‘page_title’;

+1 很好的解决方案。我不知道那种方法。(事实上我没有搜索) :) - kostas ch.
1
这看起来非常复杂,容易出现并发问题。此外,如果您没有为“UPDATE”中提到的字段列表创建复合索引,它将运行缓慢。但是,一旦创建了这样的索引,“REPLACE INTO”将运行得更快,而且更短(并且原子性更好)。 - mvp
所有字段都应该被考虑,因为我正在尝试将Excel电子表格中的数据添加到数据库中,所以如果记录已经存在,则不应存储。目前,由于它是一个插入语句,所以它只会插入全部内容。@kostasch。 - Vithiyah

-1
只需编写SQL查询来检查行数(在where子句中使用主键)。
如果计数= 0,则执行更新查询,否则执行插入查询。
注意:使用一个存储过程来执行整个任务,而不是控制到代码级别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接