首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ON DUPLICATE UPDATE insert查询for update exist

使用ON DUPLICATE UPDATE insert查询for update exist
EN

Stack Overflow用户
提问于 2011-05-28 18:50:44
回答 2查看 2.3K关注 0票数 1
代码语言:javascript
复制
connection()
{
  OleDbConnection nwindConn=new OleDbConnection();
  MySql.Data.MySqlClient.MySqlConnection con= new MySqlConnection();
  MySqlCommand cmd;
  con.ConnectionString ="server=localhost;" +
                        "uid=root;"+
                        "pwd=;" +
                        "database=globasys;" ;
  DateTime dt=DateTime.Now;       
  string select = "SELECT CategoryID, CategoryName FROM categories";
  MySqlDataAdapter catDA = new MySqlDataAdapter(select, con);
  string insert = "insert into categories(CategoryID,CategoryName)
      VALUES(@CategoryID,@CategoryName)
      ON DUPLICATE KEY UPDATE CategoryID=@CategoryID";
  catDA.InsertCommand = new MySqlCommand(insert, con);
  catDA.InsertCommand.Parameters.Add("@CategoryID", MySqlDbType.Int32
                                     , 11, "CategoryID");
  catDA.InsertCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar
                                     , 250, "CategoryName");            
  DataSet catDS = new DataSet();
  catDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  catDA.Fill(catDS, "Categories");
  DataSet newdt = new DataSet();
  newdt = getnewdata();        
  int i= catDA.Update(newdt, "Categories");
}

public DataSet getnewdata()
{
  DataSet catDS=new DataSet();
  DataTable dt = new DataTable();
  DataColumn col1 = new DataColumn("CategoryID", typeof(int));
  dt.Columns.Add(col1);            
  DataColumn col=new DataColumn("CategoryName",typeof(string));
  dt.Columns.Add(col);          
  DataColumn[] Cols = { dt.Columns[0] };
  dt.PrimaryKey =Cols;
  DataRow crow = dt.NewRow();
  crow["CategoryID"]=1;
  crow["CategoryName"]="io";
  dt.Rows.Add(crow);
  dt.TableName = "Categories";            
  DataRow crow1 = dt.NewRow();
  crow1["CategoryID"] = 3;
  crow1["CategoryName"] = "p";
  dt.Rows.Add(crow1);
  dt.TableName = "Categories";
  catDS.Tables.Add(dt);
  return catDS;
}

我希望insert命令ON DUPLICATE KEY UPDATE用新值更新旧值。如果这些值不存在,则需要插入一个新值。

它会执行,但不会更新现有值

考虑到我的桌子

代码语言:javascript
复制
1 a
2 b

使用此查询

代码语言:javascript
复制
INSERT INTO categories(CategoryID,CategoryName) 
VALUES(1,qq) ON DUPLICATE KEY UPDATE CategoryID = 1

然后我希望结果是

代码语言:javascript
复制
1 qq
2 b
EN

回答 2

Stack Overflow用户

发布于 2011-05-28 19:03:29

您使用了错误的命令。

请改用以下查询:

代码语言:javascript
复制
REPLACE INTO categories (CategoryID,CategoryName) 
VALUES(1,qq);

这就是查询不起作用的原因

代码语言:javascript
复制
INSERT INTO categories(CategoryID,CategoryName) 
VALUES(1,qq) ON DUPLICATE KEY UPDATE CategoryID = 1

这段代码试图将1插入到CategoryID中,但这不起作用,因为表中已经有1了。

接下来,运行ON DUPLICATE KEY子句。

这会将CategoryID设置为1。

但是之前是1,之后是1,所以什么都没有改变,您仍然在尝试插入重复的键。

在那之后,MySQL别无选择,放弃了。

票数 2
EN

Stack Overflow用户

发布于 2014-03-19 18:18:37

您使用的语句是正确的,但使用的方式是错误的。

而不是

代码语言:javascript
复制
INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,"qq") ON DUPLICATE KEY UPDATE CategoryID = 1

你应该写下

代码语言:javascript
复制
INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,"qq") ON DUPLICATE KEY UPDATE CategoryName = VALUES(CategoryName)

因为您必须将要更改的列放在关键字UPDATE之后,在本例中是CategoryName。VALUES(CategoryName)意味着新值是您已经为INSERT声明的值-在本例中是"qq“。

这是官方文档:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

这句话比REPLACE INTO更好,有几个原因。例如,请看这里:Insert into a MySQL table or update if exists

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6161171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档