0

我有一个具有复合主键的数据库表(id_a, id_b)。这不是他们实际上所说的,但我正在简化这个问题。id_a是一个外键,id_b只是一个整数,可以说是“序列号”。我不能只进行id_bauto_incrementing,因为 InnoDB 存储引擎不允许使用它(因为它不是复合键中的第一个字段)。

我想使这些对象可以与“分组” id_a,例如:

id_a    id_b
----------------
1       1
1       2
2       1
2       2
2       3

并且用 ( ) 插入一行的结果id_a=1应该自动设置id_b=3。我想避免使用数据库锁,特别是因为当id_a完全允许并发插入时不需要锁定整个表。

我通过 SQLAlchemy(使用 ORM)通过 Python 访问这个数据库,尽管我怀疑这个问题可以在客户端(纯 MySQL)方面得到不可知论的回答。

4

1 回答 1

1

SELECT coalesce(max(ID_B),0)+1 FROM yourTable WHERE ID_A = '1'

但是,如果没有锁定,您将面临获得重复 ID_B 值的风险,因此您必须处理插入语句中的重复键错误。在代码中自动“重试”一定次数或出错并强制用户重试。

于 2012-06-10T18:58:11.607 回答