首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从API防止MySQL中的多次插入

从API防止MySQL中的多次插入
EN

Stack Overflow用户
提问于 2017-06-05 17:36:40
回答 1查看 328关注 0票数 0

我有一个MySQL MyISAM表"transaction“。

模式类似于:

代码语言:javascript
复制
+-----+--------+-------------------+---------------------+
| id  | amount | duplication_check |        date         |
+-----+--------+-------------------+---------------------+
| 123 |     80 |         123456789 | 2017-06-05 11:12:23 |
| 124 |     80 |         123456788 | 2017-06-05 11:12:23 |
+-----+--------+-------------------+---------------------+

duplication_check可以是空/空的,但是如果它是从脚本(例如来自API调用)传递的,那么我的PHP代码执行一个简单的检查:

代码语言:javascript
复制
SELECT id FROM transaction WHERE duplication_check == 'passed_from_external'.

如果这返回一个结果,当然事务失败。

现在,我自己开发了一个Android应用程序--当通过API提交事务时--这个duplication_check (我用一个time()函数生成它)。

当智能手机失去连接时,我可以在API日志(记录API调用的另一个表)中读取2或3次API调用,API调用我的服务器2-3次,使用相同的重复代码。

不幸的是,INSERT调用被执行了三次。但是,通过PHP测试,我无法复制这个bug (使用相同duplication_check的调用失败)。

API日志示例(注意3个不同的日期):

代码语言:javascript
复制
+--------+--------+-------------------+---------------------+
| id_api | amount | duplication_check |        date         |
+--------+--------+-------------------+---------------------+
|    123 |     80 | AAAAAAA           | 2017-06-05 11:12:23 |
|    124 |     80 | AAAAAAA           | 2017-06-05 11:12:25 |
|    125 |     80 | AAAAAAA           | 2017-06-05 11:12:27 |
+--------+--------+-------------------+---------------------+

事务结果(请注意API日志旁边的3个相同日期):

代码语言:javascript
复制
+--------+--------+-------------------+---------------------+
|   id   | amount | duplication_check |        date         |
+--------+--------+-------------------+---------------------+
| 123111 |     80 | AAAAAAA           | 2017-06-05 11:12:28 |
| 124112 |     80 | AAAAAAA           | 2017-06-05 11:12:28 |
| 125113 |     80 | AAAAAAA           | 2017-06-05 11:12:28 |
+--------+--------+-------------------+---------------------+

也许,我需要编辑安卓应用程序来阻止多个调用,但是,这是否可能是一个多INSERT表,是否有可能阻止它们呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-09 12:10:58

为什么不用duplication_check行建立一个唯一的索引呢?这将防止多写一次。您将需要一个唯一的空列,因此当您没有任何值时,NULL就会被添加(并且不会生成一个重复的值)。是的,您可以修改(或编辑)表,并使用随机选择的唯一代码添加(或修改)列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44374548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档