Roy*_*Roy 147 mysql on-duplicate-key
我已经四处搜索,但没有找到是否可能.
我有这个MySQL查询:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
Run Code Online (Sandbox Code Playgroud)
字段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
Run Code Online (Sandbox Code Playgroud)
要么:
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)
Run Code Online (Sandbox Code Playgroud)
我已经在插入中指定了所有内容......
一个额外的说明,我想使用工作来获取ID!
id=LAST_INSERT_ID(id)
Run Code Online (Sandbox Code Playgroud)
我希望有人能告诉我最有效的方法是什么.
hjp*_*r92 75
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;
Run Code Online (Sandbox Code Playgroud)
要获得id
从LAST_INSERT_ID
; 您需要指定您正在使用的后端应用程序.
对于LuaSQL,conn:getlastautoid()
获取值.
Dan*_*ack 38
SQL的MySQL特定扩展可能是你想要的 - REPLACE INTO
但是它与'ON DUPLICATE UPDATE'的工作原理完全不同
它删除与新行冲突的旧行,然后插入新行.只要你没有表上的主键就可以了,但如果你这样做,那么如果你有任何其他表引用那个主键
您不能引用旧行中的值,因此您无法执行相应的操作
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;
Run Code Online (Sandbox Code Playgroud)我想用这个工作来获取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`);
Run Code Online (Sandbox Code Playgroud)
小智 22
这是您的问题的解决方案:
我试图解决像你这样的问题,我想建议从简单的方面进行测试.
请遵循以下步骤:学习简单的解决方案.
步骤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;
Run Code Online (Sandbox Code Playgroud)
步骤2:使用以下SQL Query 创建两列索引以防止重复数据:
ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);
Run Code Online (Sandbox Code Playgroud)
步骤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';
Run Code Online (Sandbox Code Playgroud)
Roy*_*Roy 21
没有其他办法,我必须指明一切两次.第一个是插入,第二个是更新案例.
如果您能够使用脚本语言来准备SQL查询,则可以使用SET
而不是使用field = value对(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";
Run Code Online (Sandbox Code Playgroud)
示例表:
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;
Run Code Online (Sandbox Code Playgroud)
小智 6
我知道已经晚了,但我希望有人能从这个答案中得到帮助
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读以下教程:
https://mariadb.com/kb/en/library/insert-on-duplicate-key-update/
http://www.mysqltutorial.org/mysql-insert-or-update-on-duplicate-key-update/
您可能要考虑使用REPLACE INTO
的语法,但被警告,在重复的主键/唯一键,它DELETES行和INSERTS一个新的。
您无需重新指定所有字段。但是,您应该考虑可能的性能降低(取决于您的表设计)。
归档时间: |
|
查看次数: |
239129 次 |
最近记录: |