Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你能保证mysql中的序列号是唯一的吗_Mysql_Uniqueidentifier_Unique Constraint_Sequential - Fatal编程技术网

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

你能保证mysql中的序列号是唯一的吗,mysql,uniqueidentifier,unique-constraint,sequential,Mysql,Uniqueidentifier,Unique Constraint,Sequential,因此,我们正在处理信用卡支付,每次支付都需要一个唯一的参考ID。我们使用的是MySQL 有一个payments表,它有一个自动递增的主键id、处理日期、创建日期、更新日期。我的问题是,在处理付款之前无法保留此记录(由于应用程序工作流的原因,此过程无法更改)。因此,我们不能简单地使用主键,因为它在处理付款后才存在,并且添加了一个带有唯一约束的reference\u id列 我的问题是,是否有可靠的方法根据现有表列(即使用MAX(reference_id)+1)生成顺序(或接近)数字,处理付款(使用

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

有一个
payments
表,它有一个自动递增的主键id、处理日期、创建日期、更新日期。我的问题是,在处理付款之前无法保留此记录(由于应用程序工作流的原因,此过程无法更改)。因此,我们不能简单地使用主键,因为它在处理付款后才存在,并且添加了一个带有唯一约束的
reference\u id


我的问题是,是否有可靠的方法根据现有表列(即使用
MAX(reference_id)+1
)生成顺序(或接近)数字,处理付款(使用curl)然后在确保唯一性的同时,使用先前生成的
reference\u id
将付款记录插入表中。基本上是将先前生成的引用id保留在数据库中。

不要试图将其基于现有列。如果您同时进行两个事务,那么最终可能会有两个具有相同ID的事务

基于一个或一个时间戳

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

许多网关使用相同的方案


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

不要试图将它建立在现有列的基础上。如果您同时进行两个事务,那么最终可能会有两个具有相同ID的事务

基于一个或一个时间戳

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

许多网关使用相同的方案


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

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

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


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

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

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


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

您需要一个额外的表作为参考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];
--真正的工作:


由于锁的存在,即使在回滚之后,也不会出现并发的完整性问题。但是用户可能需要等待。

您需要一个额外的表作为参考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];
--真正的工作:


由于锁的存在,即使在回滚之后,也不会出现并发的完整性问题。但用户可能需要等待。

生成唯一的号码不是问题,而是要确保它们是连续的。序列中可能有跳过的元素(有原因)。这就排除了随机数的使用。生成唯一的数字不是问题,而是要确保它们是连续的。序列中可能有跳过的元素(有原因)。这可能排除了随机数的使用。这与我们目前正在考虑的方法相似。这与我们目前正在考虑的方法相似。