意外的基数违规(子查询返回超过1行)

时间:2016-09-08 11:48:18

标签: php mysql cardinality

请考虑以下示例:

存在结构table主键),idvalue的MySQL表格(unique_id)。

每当用户点击Button A时,PHP都会执行以下查询:

SELECT `id` FROM `table` WHERE `unique_id` = x; //where x is a `unique_id`

如果查询未返回任何内容(x列中尚不存在IE unique_id),则新行将插入table xunique_id {1}}栏)。

...继续这个逻辑:

查看Page A时执行查询:

SELECT `id` FROM `table` WHERE `unique_id` = x;

今天我收到了以下错误:

SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row

这是我第一次遇到这个问题(表格超过20k行)。

如果两个单独的用户在同一时刻(低至毫秒)同时点击Button A,则可能会在unique_id列中写入两行重复的值?

如果是这样,我怎么能在将来再次避免这种情况发生? (我在这里采取了错误的方法吗?)。

1 个答案:

答案 0 :(得分:3)

使用您正在使用的方法,答案很可能是可以创建两个记录。首先要做的是在UNIQUE INDEX列上实际创建unique_id。根据你的问题,它似乎没有。

这提出了另一个问题。你真的需要你桌上的idunique_id吗?可以仅使用一个或另一个。 如果您删除unique_id并仅依赖主键并将其转换为自动增量字段,则此问题将不存在。

如果您想继续使用当前方法,请添加唯一索引,然后先执行 INSERT