正在使用ON DUPLICATE KEY UPDATE插入查询来更新已存在的行
本文关键字:更新 查询 存在 插入 UPDATE ON KEY DUPLICATE | 更新日期: 2023-09-27 17:58:03
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;
}
我希望插入命令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
您使用了错误的命令。
改为使用此查询:
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就没有选择了,并且放弃了。
您使用了正确的语句,但使用了错误的方式。
代替
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"。
这是官方文件:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
由于以下几个原因,该语句比REPLACE INTO
更好。请参见此处,例如:插入MySQL表或更新(如果存在(