重复密钥更新与插入相同
我搜查了周围,但没有发现是否有可能。
我有这个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
语句,以便旧字段可以更新为新的值。 如果您的旧值与新值相同,那么为什么您需要在任何情况下更新?
例如。 如果您的列a
到g
已经设置为2
到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=a, b=b, c=c, d=d, e=e, f=f, g=g;
从LAST_INSERT_ID
获取id
; 你需要指定你正在使用的后端应用程序。
对于LuaSQL, conn:getlastautoid()
获取值。
有一个MySQL特定的SQL扩展,可能是你想要的 – REPLACE INTO
然而,它不工作非常相似'重复更新'
-
它会删除与新行冲突的旧行,然后插入新行。 只要你在表上没有主键就没问题,但是如果你这样做,那么如果任何其他表引用了主键
-
你不能在旧的行中引用这些值,所以你不能做同样的事情
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;
步骤2:使用以下SQL查询创build两列的索引以防止重复的数据:
ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);
或者, 从GUI创build两列索引,如下所示:
步骤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';
您可能需要考虑使用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