在重复键更新一样插入在重复键更新一样插入(On Duplicate Key Update same

2019-05-03 23:35发布

我四处搜寻,但没有找到,如果可能的。

我有这个MySQL查询:

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

现场标识具有“唯一索引”,所以不可能有两个人。 现在,如果同样的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)

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

Answer 1:

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;

要获得idLAST_INSERT_ID ; 你需要指定您使用的是相同的后端应用程序。

对于LuaSQL,一个conn:getlastautoid()取的值。



Answer 2:

有一个MySQL特定扩展到SQL,可能是你想要的东西- REPLACE INTO

但是它不工作的不太一样“对重复UPDATE”

  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可能不会接受你,因为它会删除旧行是通过唯一键冲突。

有人建议前,您可以通过减少一些打字:

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


Answer 3:

这是你的问题的解决方案:

我试图解决的问题像你和我想建议从简单的方面来测试。

请按照下列步骤:从简单的解决方案了解。

步骤1: 创建使用该SQL查询表模式

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查询,以防止重复数据:

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

或者,如下创建两个柱的从GUI的索引

第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';



Answer 4:

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



Answer 5:

万一你能够利用脚本语言编写SQL查询,您可以通过使用再利用领域的= value对SET代替(a,b,c) VALUES(a,b,c)

用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;


Answer 6:

你可能要考虑使用REPLACE INTO语法,但被警告,在重复的主键/唯一键,它删除了该行,并插入一个新的。

你不会需要重新指定的所有字段。 但是,你应该考虑的可能性能下降(取决于你的表的设计)。

注意事项:

  • 如果你已经AUTO_INCREMENT主键,它会被赋予一个新的
  • 指数可能会需要更新


Answer 7:

我知道这是晚了,但我希望有人会帮助这个答案

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

您可以在下面这里的教程:

https://mariadb.com/kb/en/library/insert-on-duplicate-key-update/

http://www.mysqltutorial.org/mysql-insert-or-update-on-duplicate-key-update/



Answer 8:

您可以使用插入忽略这样的情况下,它会忽略如果它得到重复记录INSERT忽略...; - 不会对重复键



文章来源: On Duplicate Key Update same as insert