当前位置: 首页 > 知识库问答 >
问题:

在重复密钥更新时,与insert相同

胡劲
2023-03-14

我找遍了,但没有找到是否可能。

我有一个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)

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

共有3个答案

寇丰
2023-03-14

这里有一个解决你问题的方法:

我试着解决像你这样的问题

遵循以下步骤:从简单的解决方案中学习。

步骤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`);

步骤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';
龙玄天
2023-03-14

SQL有一个特定于MySQL的扩展,这可能是您想要的-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;
    

    我想利用这项工作来获得身份证!

    只要主键是自动递增的,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`);
    

  • 翟聪
    2023-03-14

    给出了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;
    

    要从最后一次插入\u id获取id;您需要指定用于相同应用程序的后端应用程序

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

     类似资料:
    • 问题内容: 我到处搜寻,但是没有找到可能。 我有这个MySQL查询: 字段ID具有“唯一索引”,因此不能有两个。现在,如果数据库中已经存在相同的ID,我想对其进行更新。但是我真的必须再次指定所有这些字段,例如: 要么: 我已经在插入中指定了所有内容… 需要特别说明的是,我想使用变通方法来获取ID! 我希望有人能告诉我最有效的方法是什么。 问题答案: 没有其他方法,我必须两次指定所有内容。首先是插入

    • 问题内容: 在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于? 问题答案: 现在,仅在MySQL的SQLAlchemy中内置了此功能。somada141的以下答案是最佳解决方案:https ://stackoverflow.com/a/48373874/319066 在SQL语句中 如果希望生成的SQL实际上包含,则最简单的方法涉及使用装饰器。 的代码(来自关于该主题的很好的螺纹连

    • 我有一个类继承了illumb\Database\Query\Builder,并为重复密钥更新时插入创建了一个自定义方法。 有没有办法将后缀附加到插入()调用? 我环顾了一下四周,在Laravel的查询生成器中没有太多关于SQL查询的后缀或前缀的资源。 如果可以避免的话,我希望将查询生成器中原始insert()方法的主体复制到我的自定义主体中,因为这不是一个好的做法。 任何帮助都将不胜感激。非常感谢

    • 我正在尝试使用“插入...在重复密钥更新功能上选择”,但我现在遇到了麻烦。 我想插入数据到‘水果属性’表。 我的查询如下: 我遇到一个错误代码。 错误代码:1064您的SQL语法有错误;在第21行“key UPDATE cpValue=1”附近查看与您的MariaDB服务器版本相对应的手册,以获得正确的语法 我的查询有什么问题吗?我真的不知道.. 谢谢.

    • 如何使用选项编写原则查询?

    • 问题内容: MySQL有这样的东西: 据我所知,SQLite中不存在此功能,我想知道的是,是否有任何方法可以实现相同的效果而不必执行两个查询。另外,如果这不可能,那么您更喜欢什么: SELECT +(插入或更新) 或 UPDATE( 如果UPDATE失败,则 + INSERT ) 问题答案: 由于3.24.0 SQLite还支持upsert ,因此现在您可以简单地编写以下内容