我找遍了,但没有找到是否可能。
我有一个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)
我希望有人能告诉我什么是最有效的方法。
这里有一个解决你问题的方法:
我试着解决像你这样的问题
遵循以下步骤:从简单的解决方案中学习。
步骤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';
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`);
给出了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;
要从最后一次插入\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 ,因此现在您可以简单地编写以下内容