ホームページ > データベース > mysql チュートリアル > MySQL返回更新值(RETURNING)_MySQL

MySQL返回更新值(RETURNING)_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-01 13:01:06
オリジナル
2167 人が閲覧しました

在写SQL中,经常会有诸如更新了一行记录,之后要获取更新过的这一行。 本身从程序来说,没啥难度,大不了把这行缓存起来,完了直接访问。 但是从数据库的角度出发,怎么能快速的拿出来,而又不对原表进行二次扫描? 比如其他数据库提供了如下的语法来实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

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 = &#39;root&#39;@&#39;localhost&#39; */

    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 = &#39;root&#39;@&#39;localhost&#39; */

    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 = &#39;root&#39;@&#39;localhost&#39; */

    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

2

3

4

5

6

7

8

9

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

ログイン後にコピー

1

2

3

4

5

6

7

8

9

10

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)

ログイン後にコピー

 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート