写入mysql_MYSQL更新写入数据—不同于INSERT INTO 的REPLACE INTO语法介绍

本文介绍了MySQL的REPLACE INTO语句,它在遇到主键或唯一索引冲突时会先删除旧记录,再插入新记录,简化了UPDATE和INSERT的组合操作。对比UPDATE,REPLACE在无匹配记录时执行插入,有重复记录时执行更新。同时,讨论了REPLACE的不同用法和返回值含义,以及在处理多唯一索引时可能的影响。
摘要由CSDN通过智能技术生成
0a3bc7679694996507cd8872266dbeab.png

我们在使用 MySQL 数据库时可能会遇到这种情况。如下Students_hobby_t 表,Id字段为唯一索引,当我们使用 INSERT 向 Students_hobby_t 表中写入一条记录,且该条记录的 Id值已存在于表中,则将会抛出主键冲突的错误。

当然,有时候我们需要使用新记录的值来覆盖原来的记录值。如果使用传统的做法,则需要必须先使用DELETE 语句删除原先的记录,然后再使用 INSERT 写入新的记录。

fef64c2ed4a4d05da13deb159103accc.png

REPLACE INTO

除此之外,在MySQL中提供了一种新的解决方案,那就是 REPLACE INTO 语句。使用REPLACE写入一条记录时, 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。否则,直接插入新数据,避免了在同时使用DELETE和INSERT时添加事务等复杂操作了。

在使用REPLACE时,表中必须存在主键索引或唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE将和INSERT完全一样的。

如下,使用REPLACE语句是写入或更新一条记录。

08c4a16a9c3a476c8bc7d2a75b152097.png

使用REPLACE写入或更新多条记录:

75bb7bc8970d757e97f637fd555cd453.png

REPLACE也可以使用 SET 语句写入或更新记录:

d7fd6e4cd81dfd87b544617dee77c129.png

另外,还支持 REPLACE SELECT 用法,即使用REPLACE SELECT从Students_hobby_o 表中将所有数据导入Students_hobby_t 中。这种用法并不要求列名匹配,只关心字段的位置。

4eb07ca3b91448c8033761784044e8a6.png

如上即为REPLACE INTO语法的三种形式:

  • replace into table(col, …) values(…)
  • replace into table(col, …) select
  • replace into table set col=value, …

除此之外,我们还需要知道。使用 REPLACE写入一条记录后,数据库将返回所影响的行数:

  • 如果返回 1 时,则说明在表中并没有重复的记录。
  • 如果返回 2 时,则说明有一条重复记录,数据库先自动使用 DELETE删除这条记录,然后再使用INSERT 写入新的记录。
  • 如果当返回的值大于2 时,则说明存在多个唯一索引,在这种情况下,REPLACE将考虑每一个唯一索引,并对每一个索引对应的重复记录都删除,然后再写入这条新记录,即有多条记录被删除和写入。

这里需要注意的是,如果当表中存在多个唯一索引时,使用REPLACE需要注意以下情况,假设有Students_hobby_t 表的Id、Phone都是唯一索引,如下:

af467dc55a32bbc2ef21858dae16fedf.png

此时,我们使用REPLACE 语句向Students_hobby_t 中写入一条记录。

d5ce8b6a1b368be2dbcab952dd3eb473.png

返回结果如下:

dd11227ce0b131c185d729cb44754e9f.png

此时Students_hobby_t 表数据如下:

662ff46793b5636119402ac06642584b.png

我们可以看到,REPLACE将原先的2 条记录都删除了,然后将新的记录写入。


UPDATE和REPLACE的区别

  • UPDATE 中WHERE 条件没有匹配到记录时,不执行任何操作。而REPLACE在有重复记录时执行更新(先删除后写入)操作,在没有重复记录时执行写入操作。
  • UPDATE可以选择性地更新记录的部分字段,而REPLACE在发现有重复记录时就将这条记录彻底删除,再插入新的记录,即将所有的字段都更新。

最后,不建议使用REPLACE INTO更新部分字段,可能会导致其它有值字段变为NULL。

要将实时计算的当天 PV 写入 MySQL,可以使用 Flink 的 JDBC Connector 连接器,将结果输出到 MySQL 数据库中。 以下是一个示例代码: ``` DataStream<Tuple2<String, Integer>> pvStream = ...; // 获取实时计算的当天 PV 数据流 // 将结果写入 MySQL pvStream.addSink(JdbcSink.sink( "INSERT INTO pv_count(date, pv) VALUES (?, ?)", (ps, t) -> { ps.setDate(1, new java.sql.Date(System.currentTimeMillis())); ps.setInt(2, t.f1); }, new JdbcConnectionOptions.JdbcConnectionOptionsBuilder() .withUrl("jdbc:mysql://localhost:3306/db") .withDriverName("com.mysql.jdbc.Driver") .withUsername("user") .withPassword("password") .build() )); ``` 其中,`pvStream` 是一个包含了当天 PV 数量的数据流。`JdbcSink.sink` 方法将数据写入 MySQL 数据库中,第一个参数是 SQL 语句,第二个参数是将数据写入 PreparedStatement 中的逻辑,第三个参数是连接 MySQL 的配置信息。 在这个示例中,我们使用了一个 `pv_count` 表,用于存储每天的 PV 数量。表中包含两个字段:`date` 用于存储日期,`pv` 用于存储当天的 PV 数量。在 `JdbcSink.sink` 的第一个参数中,我们使用了一个占位符 `?` 来表示这两个字段。在第二个参数中,我们将当前时间作为日期写入了 PreparedStatement 中的第一个参数,将当天 PV 数量写入了第二个参数。在第三个参数中,我们指定了连接 MySQL 数据库的配置信息。 这样,当 Flink 实时计算出当天的 PV 数量后,就会自动将结果写入 MySQL 数据库中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值