意外的基数违规(子查询 returns 多于 1 行)

Unexpected cardinality violation (Subquery returns more than 1 row)

考虑以下示例:

A MySQL table (table) 结构 id (主键), value , unique_id 存在。

只要用户点击 Button A,PHP 就会执行以下查询:

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

如果查询 returns 什么都没有(即 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

这是我第一次遇到这个问题(table 超过 20k 行)。

如果两个不同的用户都在同一时刻(精确到毫秒)都单击了 Button A,那么 [=17= 中的两行可能会写入重复值] 列?

如果是这样,我怎样才能避免以后再次发生这种情况? (我在这里采取了错误的方法吗?)。

根据您使用的方法,答案很可能是可以创建两条记录。首先要做的是在 unique_id 列上实际创建 UNIQUE INDEX。根据你的问题,它似乎没有。

这又提出了另一个问题。您真的需要 table 中的 idunique_id 吗?可能只使用一个或另一个。 如果你放弃 unique_id 并仅依赖主键并将其转换为自增字段,则不会存在此问题。

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