在MySQL中手动处理自动增量?

在MySQL中手动处理自动增量?,mysql,triggers,Mysql,Triggers,我们有一个包含库存的产品数据库,它将与另一个产品来源的新(不断增长的)目录合并。源1的产品目前的ID为0-50k(每月添加10-15个新产品)。来源2的产品尚未添加到我们的库存中,但其ID为1000000+。我想保持集成和识别哪个产品来自哪个目录的简单性,我们手动处理产品表中产品id的自动递增 在插入前触发器中,我们将检查以下内容: 伪代码: 对我来说,这在理论上应该是可行的,但显然我担心并发错误和冲突。从我所看到的,上面的触发器将锁定表,因此不应该有任何冲突。上述方法有任何问题吗?您显示的伪代

我们有一个包含库存的产品数据库,它将与另一个产品来源的新(不断增长的)目录合并。源1的产品目前的ID为0-50k(每月添加10-15个新产品)。来源2的产品尚未添加到我们的库存中,但其ID为1000000+。我想保持集成和识别哪个产品来自哪个目录的简单性,我们手动处理产品表中产品id的自动递增

在插入前触发器中,我们将检查以下内容:

伪代码


对我来说,这在理论上应该是可行的,但显然我担心并发错误和冲突。从我所看到的,上面的触发器将锁定表,因此不应该有任何冲突。上述方法有任何问题吗?

您显示的伪代码不会锁定表,并且在并发插入期间会受到竞争条件的影响

通常,如果不锁定整个表,就无法执行自定义的自动增量行为,因为要避免这些竞争条件,必须阻止并发插入

另一种方法是使用一些外部增量机制来生成新的id值。例如,在memcached实例中创建一个键,并使用原子增量和get调用获取新的唯一id值。不要在触发器中执行此操作,请在执行插入之前在应用程序中执行此操作

但是最好的做法是忘记使用自动递增作为某种枚举类型。它必须是独一无二的,仅此而已。不连续的不连续的或不连续的

if (product_source = 'internal_catalog') {
 new.id = SELECT max(id) + 1 FROM products where product_source = 'internal_catalog';
} else {
 new.id = new.original_product_id; -- original_product_id will always be unique and > 1000000;
}