重复密钥更新与插入相同

我搜查了周围,但没有发现是否有可能。

我有这个MySQL查询:

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 

字段ID有一个“唯一索引”,所以不能有两个。 现在,如果数据库中已经存在相同的ID,我想更新它。 但是我真的必须重新指定所有这些领域,如:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8 

要么:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g) 

我已经指定了插入中的所有内容…

一个额外的笔记,我想使用的工作,以获得ID!

 id=LAST_INSERT_ID(id) 

我希望有人能告诉我最有效的方法是什么。

给出UPDATE语句,以便旧字段可以更新为新的值。 如果您的旧值与新值相同,那么为什么您需要在任何情况下更新?

例如。 如果您的列ag已经设置为28 ; 将不需要重新更新它。

或者,您可以使用:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=a, b=b, c=c, d=d, e=e, f=f, g=g; 

LAST_INSERT_ID获取id ; 你需要指定你正在使用的后端应用程序。

对于LuaSQL, conn:getlastautoid()获取值。

有一个MySQL特定的SQL扩展,可能是你想要的 – REPLACE INTO

然而,它不工作非常相似'重复更新'

  1. 它会删除与新行冲突的旧行,然后插入新行。 只要你在表上没有主键就没问题,但是如果你这样做,那么如果任何其他表引用了主键

  2. 你不能在旧的行中引用这些值,所以你不能做同样的事情

     INSERT INTO mytable (id, a, b, c) values ( 1, 2, 3, 4) ON DUPLICATE KEY UPDATE id=1, a=2, b=3, c=c + 1; 

我想用周围的工作来获得ID!

这应该工作 – last_insert_id()应该有正确的值,只要您的主键是自动递增。

不过,正如我所说,如果你真的在其他表中使用主键, REPLACE INTO可能不会被你接受,因为它删除了通过唯一键冲突的旧行。

别人之前build议你可以通过下面的方法来减less一些打字:

 INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3) ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`); 

没有其他办法,我必须指定一切两次。 第一次插入,第二次在更新情况下。

这是你的问题的解决scheme:

我试图解决像你这样的问题,我想build议从简单的方面进行testing。

遵循这些步骤:从简单的解决scheme中学习

第1步:使用此SQL查询创build表模式

 CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(32) NOT NULL, `status` tinyint(1) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `no_duplicate` (`username`,`password`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; 

包含数据的表<code> user </ code>

步骤2:使用以下SQL查询创build两列的索引以防止重复的数据:

 ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`); 

或者, 从GUI创build两列索引,如下所示: 从GUI创建索引 选择列来创建索引 表<code> user </ code>的索引

步骤3: 更新是否存在,如果不使用以下查询,请插入

 INSERT INTO `user`(`username`, `password`) VALUES ('ersks','Nepal') ON DUPLICATE KEY UPDATE `username`='master',`password`='Nepal'; INSERT INTO `user`(`username`, `password`) VALUES ('master','Nepal') ON DUPLICATE KEY UPDATE `username`='ersks',`password`='Nepal'; 

运行以上查询之后的表<code> user </ code>

您可能需要考虑使用REPLACE INTO语法,但是在重复的PRIMARY / UNIQUE键时会被警告,它将删除该行并插入一个新的语句

你不需要重新指定所有的字段。 但是,您应该考虑可能的性能降低(取决于您的表格devise)。

注意事项:

  • 如果你有AUTO_INCREMENT主键,它将被赋予一个新的
  • 索引可能需要更新

以防万一您能够使用脚本语言来准备您的SQL查询,您可以通过使用SET而不是(a,b,c) VALUES(a,b,c)重复使用field = value对。

PHP的一个例子:

 $pairs = "a=$a,b=$b,c=$c"; $query = "INSERT INTO $table SET $pairs ON DUPLICATE KEY UPDATE $pairs"; 

示例表格:

 CREATE TABLE IF NOT EXISTS `tester` ( `a` int(11) NOT NULL, `b` varchar(50) NOT NULL, `c` text NOT NULL, UNIQUE KEY `a` (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

你可以使用插入忽略这种情况下,它会忽略,如果它得到重复的loggingINSERT IGNORE …; – 没有DUPLICATE KEY