MySQL插入创建多行

时间:2015-02-09 19:16:06

标签: mysql perl

我在运行Apache和Perl的网站上的CentOS服务器上使用MySQL。我看到了这种行为(嘲笑):

mysql> describe product;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10)      | YES  |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> insert into product (name) values ('Widget');
Query OK, 1 row affected (0.00 sec)

mysql> insert into product (name) values ('Thing');
Query OK, 1 row affected (0.00 sec)

mysql> select * from product;
+----+--------+
| id | name   |
+----+--------+
|  1 | Widget |
|  2 | Widget |
|  3 | Thing  |
+----+--------+
3 rows in set (0.00 sec)

我的理论是Perl CGI脚本可以同时执行(可能是由于双击,浏览器刷新等),因此插入执行两次。这种情况相当罕见,但一旦发生就会引发问题。

如果发生这种情况,除了' id'之外的所有列有相同的价值观。除了列' id'允许重复的值。

有没有办法防止这种行为?

1 个答案:

答案 0 :(得分:0)

如果您从CentOS存储库安装了Perl,Apache和MySQL,并且没有进行任何根本的配置更改,那么您很可能在平台中发现了错误。你使用mod_perl或PSGI还是绝对是CGI?您是否从CPAN源安装了任何Perl模块,或者是否已通过yum安装了所有内容?

您可能考虑实施的愚蠢解决方案是在脚本中生成某种nonce(一次性使用字符串或数字),为其添加一列,并在该列上为该列添加唯一索引,并将其插入与其余的表单数据。如果您发现重复键错误,请忽略它。这不会解释发生了什么,但它会阻止它发生。