请考虑以下示例:
存在结构table
(主键),id
,value
的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
x
中unique_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
列中写入两行重复的值?
如果是这样,我怎么能在将来再次避免这种情况发生? (我在这里采取了错误的方法吗?)。
答案 0 :(得分:3)
使用您正在使用的方法,答案很可能是可以创建两个记录。首先要做的是在UNIQUE INDEX
列上实际创建unique_id
。根据你的问题,它似乎没有。
这提出了另一个问题。你真的需要你桌上的id
和unique_id
吗?可以仅使用一个或另一个。
如果您删除unique_id
并仅依赖主键并将其转换为自动增量字段,则此问题将不存在。
如果您想继续使用当前方法,请添加唯一索引,然后先执行 INSERT 。