2016-09-08 72 views
1

考虑下面的例子:意外基数违规(子查询返回多于1行)

甲MySQL表(table)与结构id主键),valueunique_id存在。

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

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

如果查询没有返回值(IE x还没有在unique_id列存在),新行插入table(在unique_id列中有x)。


...与该逻辑继续:观看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_id列上实际创建UNIQUE INDEX。根据你的问题,它似乎没有一个。

这引发了另一个问题。你真的需要表中的idunique_id吗?它可能只能使用一个或另一个。 如果删除unique_id并仅依赖主键并将其转换为自动增量字段,则不存在此问题。

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