考虑以下示例:
具有结构 id
(主键)、值
、 的 MySQL 表(
存在。表
) unique_id
每当用户单击按钮 A
时,PHP 都会执行以下查询:
SELECT `id` FROM `table` WHERE `unique_id` = x; //where x is a `unique_id`
如果查询没有返回任何内容(即 x
尚不存在于 unique_id
列中),新行将插入到 table
中(在 unique_id
列中使用 x
。
...继续这个逻辑:
查看页面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
列?
如果是这样,我怎样才能避免以后再次发生这种情况? (我在这里采取了错误的方法吗?)。
最佳答案
根据您使用的方法,答案很可能是可以创建两条记录。首先要做的是在 unique_id
列上实际创建 UNIQUE INDEX
。根据你的问题,它似乎没有。
这引发了另一个问题。您真的需要表中的 id
和 unique_id
吗?可能只使用一个或另一个。
如果您删除 unique_id
并仅依赖主键并将其转换为自动递增字段,则不会存在此问题。
如果您想继续使用当前的方法,请添加唯一索引,然后先插入。
关于php - 意外的基数违规(子查询返回超过 1 行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39390116/