意外的基数违规(子查询 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 什么都没有(即 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
这是我第一次遇到这个问题(table 超过 20k 行)。
如果两个不同的用户都在同一时刻(精确到毫秒)都单击了 Button A
,那么 [=17= 中的两行可能会写入重复值] 列?
如果是这样,我怎样才能避免以后再次发生这种情况? (我在这里采取了错误的方法吗?)。
根据您使用的方法,答案很可能是可以创建两条记录。首先要做的是在 unique_id
列上实际创建 UNIQUE INDEX
。根据你的问题,它似乎没有。
这又提出了另一个问题。您真的需要 table 中的 id
和 unique_id
吗?可能只使用一个或另一个。
如果你放弃 unique_id
并仅依赖主键并将其转换为自增字段,则不会存在此问题。
如果您想继续当前的方法,请添加唯一索引,然后先执行 INSERT。
考虑以下示例:
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 什么都没有(即 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
这是我第一次遇到这个问题(table 超过 20k 行)。
如果两个不同的用户都在同一时刻(精确到毫秒)都单击了 Button A
,那么 [=17= 中的两行可能会写入重复值] 列?
如果是这样,我怎样才能避免以后再次发生这种情况? (我在这里采取了错误的方法吗?)。
根据您使用的方法,答案很可能是可以创建两条记录。首先要做的是在 unique_id
列上实际创建 UNIQUE INDEX
。根据你的问题,它似乎没有。
这又提出了另一个问题。您真的需要 table 中的 id
和 unique_id
吗?可能只使用一个或另一个。
如果你放弃 unique_id
并仅依赖主键并将其转换为自增字段,则不会存在此问题。
如果您想继续当前的方法,请添加唯一索引,然后先执行 INSERT。