你能保证mysql中唯一的序列号吗?

时间:2011-02-23 00:03:16

标签: mysql uniqueidentifier unique-constraint sequential

因此,我们正在处理信用卡付款,每笔付款都需要一个唯一的参考ID。我们正在使用MySQL。

有一个payments表,它有一个自动递增的主键id,processing_date,created_at,updated_at。我的问题是,在处理完付款之后,此记录不能保留(由于应用程序工作流程,此过程无法更改)。因此,我们不能简单地使用主键,因为在处理完付款之后它才会存在,并且之后添加了一个具有唯一约束的reference_id列。

我的问题是,有没有一种可靠的方法来生成基于现有表格列的顺序(或接近)数字(即使用MAX(reference_id) + 1之类的东西),处理付款(使用curl)然后插入使用先前生成的reference_id将付款记录放入表中,同时确保唯一性。基本上保留以前生成的reference_id与数据库。

3 个答案:

答案 0 :(得分:2)

不要尝试将其基于现有列。如果您同时获得2笔交易,则最终可能会有2笔具有相同ID的交易。

将其基于UUID或时间戳。

我有一个类似的系统,交易ID是MMDDYYHHMMSS + 8位随机数。这对于小批量交易是可以的,并且在1秒内不太可能有2个或更多重复交易。

许多网关使用相同的方案。

UUID是最安全的,因为它保证它是全球唯一的。

答案 1 :(得分:1)

您可以将另一列添加到付款表中作为状态/已确认标记。付款开始时,您插入值并将状态设置为“已启动”(或其他),这样您就可以使用自动生成的ID。

付款完成后,您可以将标记设置为“已完成”。如果付款被拒绝,请删除该行。

为了优化这一点,您还可以创建一个每晚运行的内务处理程序,并删除状态为“已启动”且超过2天或类似情况的行。

答案 2 :(得分:1)

您需要为reference_id添加一个额外的表,并在每次需要新号码时更新此值。在交易中包裹所有内容并保存。使用MySQL变量可以使SQL变得非常简单:

CREATE TABLE reference_id(
id INT NOT NULL
);
INSERT INTO reference_id (id) VALUES (1);

REVOKE INSERT, DELETE, TRUNCATE FROM [all users];

- 真正的工作:

BEGIN;
SET @i = 0;
SELECT id + 1 INTO @i FROM reference_id FOR UPDATE;
UPDATE reference_id SET id = @i;
INSERT INTO other_table(ref_id, content) VALUES(@i, 'bla');
COMMIT;

由于锁定,您不会遇到并发性的完整性问题,即使在ROLLBACK之后也是如此。但用户可能不得不等待。