考虑以下示例:
一个结构为id
(Primary Key), value
, unique_id
的MySQL表(table
)存在
当用户单击Button A
时,PHP执行以下查询:
SELECT `id` FROM `table` WHERE `unique_id` = x; //where x is a `unique_id`
如果查询没有返回任何结果(即x
在unique_id
列中不存在),则将新行插入table
(x
在unique_id
列中)。
…继续这个逻辑:
查看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
列中写入重复的值?
如果是这样,我怎样才能避免这种情况在未来再次发生?(我是不是用错方法了?)
使用您正在使用的方法,答案很可能是可以创建两个记录。首先要做的是在unique_id
列上实际创建UNIQUE INDEX
。根据你的问题,它似乎没有。
这就引出了另一个问题。您真的需要在表中同时使用id
和unique_id
吗?可能只使用其中一种。如果去掉unique_id
,只依赖于主键并将其转换为自动增量字段,则不会存在此问题。
如果您想继续使用当前的方法,请添加唯一索引,然后先执行INSERT 。