意外的基数冲突(子查询返回多于一行)


Unexpected cardinality violation (Subquery returns more than 1 row)

考虑以下示例:

一个结构为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`

如果查询没有返回任何结果(即xunique_id列中不存在),则将新行插入table (xunique_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。根据你的问题,它似乎没有。

这就引出了另一个问题。您真的需要在表中同时使用idunique_id吗?可能只使用其中一种。如果去掉unique_id,只依赖于主键并将其转换为自动增量字段,则不会存在此问题。

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