mysql replace into用法与坑
转载需要主键一致
PRIMARY KEY (id)
PRIMARY KEY (id, ts)
坑:
可以看到 MySQL 说 “2 rows affected”,可是明明是只写一条记录,为什么呢?这是因为 MySQL 在执行 REPLACE INTO auto (k) VALUES (1) 时首先尝试 INSERT INTO auto (k) VALUES (1),但由于已经存在一条 k=1 的记录,发生了 duplicate key error,于是 MySQL 会先删除已有的那条 k=1 即 id=1 的记录,然后重新写入一条新的记录。
这时候 slave 上出现了诡异的问题:
AUTO_INCREMENT 却并未更新,这会有什么问题呢?把这个 slave 提升为 master 之后,由于 AUTO_INCREMENT 比实际的 next id 还要小,写入新记录时就会发生 duplicate key error,每次冲突之后 AUTO_INCREMENT += 1,直到增长为 max(id) + 1 之后才能恢复正常:
由于新写入记录时并未给 extra 字段指定值,原记录 extra 字段的值就「丢失」了
实际上是,当存在 k=1 的记录时,就把 v 字段的值更新为 ‘1-1’,其他未指定的字段则保持原状,而满足这一需求的 MySQL 方言是 INSERT INTO auto (k, v) VALUES (1, ‘1-1’) ON DUPLICATE KEY UPDATE v=VALUES(v);
其中v=VALUES(v)中的v都为字段名,不是具体的值!
这条语句也一样,如果记录存在,会更新。
$sql = 'INSERT INTO rtmpTask (filename, url, ctime) VALUES (?, ?,?) ON DUPLICATE KEY UPDATE url =VALUES(url), ctime =VALUES(ctime);';
参考
时间宝贵,只能复制+粘贴,若图片无法显示或排版混乱,请访问elesos.com查找原文
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:音视频编解码开发经验1
下一篇:MySQL主主复制3
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
mysql8.0大小写的坑
这两天又被mysql8.0大小写的问题坑到了,看下面的报错:chown: cannot access './proc/38/fd/6': No such file or directorychown: cannot access './proc/38/fd/7': No such file or directorychown: cannot access './proc/38/fdinfo
lower_case_table_nam my.cnf mysql8.0 chown not permmit -
MySQL replace into 用法详细介绍
MySQL replace into 用法详细介绍
MySQL replace into 用 MySQL 数据 插入数据