我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在日常编程中,经常会出现判断id是否存在,进而调用insert还是update的场景。这里一般情况下,都是要走个流程分支的。如果从mysql数据库角度上来解决这个需求的话,倒是有个简单的方法,那就是replace into语句,一句话就可以搞定这个需要走分支的需求。

苏南大叔:mysql数据库,如何理解replace into智能插入或更新语句? - mysql-replace-into
mysql数据库,如何理解replace into智能插入或更新语句?(图3-1)

大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔的代码经验感悟。本文测试环境:win10mysql@5.6.27

replace into测试一(主键id)

经常会有数据更新的场景,表单完全一致,是不过一个是新建数据,使用insert into语句。而另外一个是数据更新,使用update xxx set语句。两者的区别仅仅在于主键id不同。

测试用数据表表结构如下:

DROP TABLE IF EXISTS `users3`;
CREATE TABLE `users3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `department` varchar(50) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `users3` VALUES (1,'技术部','苏南大叔','11111'),(2,'国际部','苏南大叔','22222'),(3,'后勤部','sunan大叔','33333');

值得说明的是:对于本文来说,要关注主键是谁,本例中的主键是最常见的自增idreplace into就是根据这个id值去决定是更新还是插入的。

苏南大叔:mysql数据库,如何理解replace into智能插入或更新语句? - 索引字段更新或插入
mysql数据库,如何理解replace into智能插入或更新语句?(图3-2)

目前数据表中,有三条数据。那么再次执行下面的replace into语句,表面上并不给数据带来任何变化。

replace INTO `users3` VALUES (1,'技术部','苏南大叔','11111'),(2,'国际部','苏南大叔','22222'),(3,'后勤部','sunan大叔','33333');

如果数据中的非主键id列,是变化的,那么执行的效果是数据更新。

replace INTO `users3` VALUES (1,'技术部1','苏南大叔1','11111'),(2,'国际部','苏南大叔','22222'),(3,'后勤部','sunan大叔','33333');

如果数据中的主键id变化,非id列不变。那么执行效果是数据插入。

replace INTO `users3` VALUES (1,'技术部','苏南大叔','11111'),(2,'国际部','苏南大叔','22222'),(5,'后勤部','sunan大叔','33333');

replace into测试二(组合主键)

replace into的标准就是主键,那么,如果主键不是id的话,执行效果就会出现偏差,并不符合预期。那么,本例中,如果主键不是id,而是departmentname的组合呢?

数据表语句如下:

DROP TABLE IF EXISTS `users3`;
CREATE TABLE `users3` (
  `uuid` varchar(36) NOT NULL,
  `department` varchar(50) NOT NULL,
  `name` varchar(50) NOT NULL,
  `password` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`department`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `users3` VALUES (uuid(),'后勤部','sunan大叔','33333'),(uuid(),'国际部','苏南大叔','22222'),(uuid(),'技术部','苏南大叔','11111');

注意这里没有自增id,而是使用了uuid()。因为自增id只要存在就必须设置为主键primary key。这和本测试用例的主旨冲突。并且组合主键里面的字段默认不能为空,所以代码里面是not null

相关文章:

苏南大叔:mysql数据库,如何理解replace into智能插入或更新语句? - 组合索引的设置影响结果
mysql数据库,如何理解replace into智能插入或更新语句?(图3-3)

replace into语句执行如下:

replace INTO `users3` VALUES (uuid(),'后勤部','sunan大叔','33333'),(uuid(),'国际部','苏南大叔','22222'),(uuid(),'技术部','苏南大叔','11111');

可见,在主键是一个多字段联合主键的情况下,只有当deparmentname都一致的情况下,才会执行更新。同时,更新uuid()的运行结果为新的uuid()数据。

现在的主键不是uuid字段,所以更新uuid的字段内容,并没有什么法理上的不妥。只是看上去有些奇怪罢了。

相关链接

总结

数据表的主索引设置是谁,将控制replace into的执行结果走向。换句话说的话,即使同样的replace into语句,也会根据表的主键变化,而产生不同的效果。再换句话来说,replace into语句存在有隐含条件:表的主键。

更多mysql相关文章,请点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   mysql