设为首页 收藏本站
查看: 4312|回复: 0

[经验分享] 【原创】MySQL 返回更新值(RETURNING)

[复制链接]

尚未签到

发表于 2018-9-29 06:23:14 | 显示全部楼层 |阅读模式
  在写SQL中,经常会有诸如更新了一行记录,之后要获取更新过的这一行。 本身从程序来说,没啥难度,大不了把这行缓存起来,完了直接访问。 但是从数据库的角度出发,怎么能快速的拿出来,而又不对原表进行二次扫描? 比如其他数据库提供了如下的语法来实现:
  返回更新掉的行:
t_girl=# update t1 set log_time = now() where id in (1,2,3) returning *;  
id |          log_time
  
----+----------------------------
  
  1 | 2014-11-26 11:06:53.555217
  
  2 | 2014-11-26 11:06:53.555217
  
  3 | 2014-11-26 11:06:53.555217
  
(3 rows)
  
UPDATE 3
  
Time: 6.991 ms
  返回删除掉的行:
t_girl=# delete from t1 where id < 2 returning *;  
id |          log_time
  
----+----------------------------
  
  1 | 2014-11-26 11:06:53.555217
  
(1 row)
  
DELETE 1
  
Time: 6.042 ms
  返回插入后的行:
t_girl=# insert into t1 select 1,now() returning *;  
id |          log_time
  
----+----------------------------
  
  1 | 2014-11-26 11:07:40.431766
  
(1 row)
  
INSERT 0 1
  
Time: 6.107 ms
  
t_girl=#
  那在MySQL里如何实现呢?
  我可以创建几张内存表来来保存这些返回值,如下:
CREATE TABLE t1_insert ENGINE MEMORY SELECT * FROM  t1 WHERE FALSE;  
CREATE TABLE t1_update ENGINE MEMORY SELECT * FROM  t1 WHERE FALSE;
  
CREATE TABLE t1_delete ENGINE MEMORY SELECT * FROM  t1 WHERE FALSE;
  
ALTER TABLE t1_insert ADD PRIMARY KEY (id);
  
ALTER TABLE t1_update ADD PRIMARY KEY (id);
  
ALTER TABLE t1_delete ADD PRIMARY KEY (id);
  以上建立了三张表来存放对应的操作。 t1_insert 保存插入;t1_update 保存更新;t1_delete 保存删除。
  那这样的话,我来创建对应的触发器完成。
DELIMITER $$  
USE `t_girl`$$
  
DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_insert_after`$$
  
CREATE
  
    /*!50017 DEFINER = 'root'@'localhost' */
  
    TRIGGER `tr_t1_insert_after` AFTER INSERT ON `t1`
  
    FOR EACH ROW BEGIN
  
      REPLACE INTO t1_insert VALUES (new.id,new.log_time);
  
    END;
  
$$
  
DELIMITER ;
DELIMITER $$  
USE `t_girl`$$
  
DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_update_after`$$
  
CREATE
  
    /*!50017 DEFINER = 'root'@'localhost' */
  
    TRIGGER `tr_t1_update_after` AFTER UPDATE ON `t1`
  
    FOR EACH ROW BEGIN
  
      REPLACE INTO t1_update VALUES (new.id,new.log_time);
  
    END;
  
$$
  
DELIMITER ;
DELIMITER $$  
USE `t_girl`$$
  
DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_delete_after`$$
  
CREATE
  
    /*!50017 DEFINER = 'root'@'localhost' */
  
    TRIGGER `tr_t1_delete_after` AFTER DELETE ON `t1`
  
    FOR EACH ROW BEGIN
  
      REPLACE INTO t1_delete VALUES (old.id,old.log_time);;
  
    END;
  
$$
  
DELIMITER ;
  创建好了以上的表和触发器后, 拿到返回值就非常容易了, 我直接从以上几张表来查询就是。
  我现在来演示:
  更新:
mysql> truncate table t1_update;  
Query OK, 0 rows affected (0.00 sec)
  
mysql> UPDATE t1 SET log_time = NOW() WHERE id < 15;
  
Query OK, 3 rows affected (0.01 sec)
  
Rows matched: 3  Changed: 3  Warnings: 0
  获取更新记录:
mysql> select * from t1_update;  
+----+----------------------------+
  
| id | log_time                   |
  
+----+----------------------------+
  
| 12 | 2014-11-26 13:38:06.000000 |
  
| 13 | 2014-11-26 13:38:06.000000 |
  
| 14 | 2014-11-26 13:38:06.000000 |
  
+----+----------------------------+
  
3 rows in set (0.00 sec)
  插入:
mysql> truncate table t1_insert;  
Query OK, 0 rows affected (0.00 sec)
  
mysql> INSERT INTO t1 VALUES (1,NOW());
  
Query OK, 1 row affected (0.08 sec)
  获取插入记录:
mysql> select * from t1_insert;  
+----+----------------------------+
  
| id | log_time                   |
  
+----+----------------------------+
  
|  1 | 2014-11-26 13:38:06.000000 |
  
+----+----------------------------+
  
1 row in set (0.00 sec)
  删除:
mysql> truncate table t1_delete;  
Query OK, 0 rows affected (0.00 sec)
  
mysql> DELETE FROM t1 WHERE id < 15;
  
Query OK, 4 rows affected (0.01 sec)
  获取删除记录:
mysql> select * from t1_delete;  
+----+----------------------------+
  
| id | log_time                   |
  
+----+----------------------------+
  
|  1 | 2014-11-26 13:38:06.000000 |
  
| 12 | 2014-11-26 13:38:06.000000 |
  
| 13 | 2014-11-26 13:38:06.000000 |
  
| 14 | 2014-11-26 13:38:06.000000 |
  
+----+----------------------------+
  
4 rows in set (0.00 sec)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-603438-1-1.html 上篇帖子: MySQL架构之MHA架构实战 下篇帖子: MySQL字符串转日期类型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表