使用ON DUPLICATE KEY UPDATE插入查询更新已存在的行

时间:2011-05-28 10:50:44

标签: c# mysql

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使用新值更新旧值。如果值不存在则需要插入新值。

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

考虑我的表

1 a
2 b

使用此查询

INSERT INTO categories(CategoryID,CategoryName) 
VALUES(1,qq) ON DUPLICATE KEY UPDATE CategoryID = 1

然后我希望结果是

1 qq
2 b

2 个答案:

答案 0 :(得分:2)

您使用了错误的命令。

请改用此查询:

REPLACE INTO categories (CategoryID,CategoryName) 
VALUES(1,qq);

以下是您的查询不起作用的原因

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没有选择并且放弃了。

答案 1 :(得分:0)

您使用的是正确的陈述,但方式错误。

而不是

INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,"qq") ON DUPLICATE KEY UPDATE CategoryID = 1

你应该写

INSERT INTO categories(CategoryID,CategoryName)
VALUES(1,"qq") ON DUPLICATE KEY UPDATE CategoryName = VALUES(CategoryName)

因为在关键字UPDATE之后,您必须放置要更改的列,在您的情况下是CategoryName。 VALUES(CategoryName)表示新值是您已为INSERT声明的值 - 在示例中为" qq&#34 ;.

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

由于多种原因,此声明优于REPLACE INTO。例如,请参见此处:Insert into a MySQL table or update if exists