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

时间:2017-04-01 17:20:56

标签: mysql triggers

我们有一个包含我们库存的产品数据库,该数据库将与另一个产品来源的新(增长)目录合并。来自源1的产品目前具有0-50k的ID(每月添加10-15个新产品)。来自源2的产品尚未添加到我们的库存中,但始于ID:1000000+。我想要保持易于集成和识别哪个产品来自哪个目录,我们手动处理产品ID中的产品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;
}

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

1 个答案:

答案 0 :(得分:2)

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

通常,在没有锁定整个表的情况下,无法执行自定义自动增量行为,因为要避免这些竞争条件,您必须阻止并发插入。

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

但是忘记将自动增量用作某种枚举类型的最佳做法。它必须是独一无二的 - 这就是全部。不连续或连续。