当前位置: 首页 > 面试题库 >

与MySQL中的Oracle序列等效

锺博耘
2023-03-14
问题内容

我有类似于Oracle的下表user_sequences

我有序列前缀/后缀的逻辑,但为简单起见,此处略过。

create table my_seq(
min_value integer,
Max_value integer,
last_value integer,
increment_by tinyint,
customer_id integer);

假设在当前表中有两条记录。

insert into my_seq(min_value,max_value,last_value,increment_by,customer_id) 
  values(1,99999999,1,1,'foo#',1),(1,999999999,100,1,'foo#',2);

我的foo表结构是这样的,

create table foo(id Auto_increment,foo_number varchar(20),customer_id integer);

约束: 我不能使用MySQL
AUTO_INCREMENT列,因为它foo包含不同的客户数据,并且每个客户都可以选择foo_number自动生成或手动输入,并且如果客户选择了auto_generation,则应该有空白。因此,customer
= 1选择了它,foo#应该是1,2,3,4,依此类推,不允许有空格。

到目前为止,如果我的应用程序在中运行,我们已经实现了自动递增逻辑single thread。我们foo_number将在foo表格中生成并填充其他数据点。

我只是简单地查询以获取下一个auto#。

select last_number from my_seq where customer_id=?;

读取#并更新记录。

update my_seq set last_number=last_number+increment_by where customer_id=?;

问题: 当多个并发会话尝试运行时select last_number from my_seq...,它会foo_number多次返回相同的结果。另外,由于应用程序端的限制和性能瓶颈,我无法在应用程序中强制执行单线程,因此需要在数据库端解决它。

请提出建议,如何避免重复的数字?请帮助,在此先感谢。

我做了谷歌,很多stackoverflow链接建议get_last_id(),如您所见,我不能使用它。


问题答案:

通过结合@Akina和@RickJames的建议,我能够解决此问题,谢谢你们俩的支持。

create table my_seq(
min_value integer,
Max_value integer,
last_value integer,
increment_by tinyint,
customer_id integer)ENGINE = InnoDB;

ENGINE=InnoDB很重要。为了确保读取时有表级锁定,我将我的应用程序代码修改为:

Auto-Commit=FALSE

然后,

//very import to begin the transaction
begin;
select last_number from my_seq where customer_id=? FOR UPDATE;

Read the result in App.

update my_seq set last_number=last_number+1 where customer_id=?;
commit;

sequence number即使在有多个并发会话的情况下,这也可以产生唯一性。

我遇到了另一个问题,该解决方案减慢了其他我生成序列号的地方。我已经解决了通过索引customer_id启用行级别锁而不是表级别锁的问题。

ALTER TABLE TABLE_NAME ADD INDEX (customer_id);

希望这对其他人有帮助。



 类似资料:
  • 问题内容: MySQL中的MSSQL 列相当于什么?如何在MySQL中创建此表? 问题答案:

  • 问题内容: 我需要能够生成运行查询,该查询将返回下表中的ID的下一个值: 在Oracle中,您可以在序列上调用NEXTVAL,它为您提供下一个序列(注意:不必在表上进行插入)。 谷歌搜索后,我发现您可以使用以下查询找到auto_increment的当前值: 问题是我希望每次查询该值时该值都增加。在Oracle中,当您调用nextval时,即使不将行插入表中,序列的值也会增加。 有什么方法可以修改上

  • 本文向大家介绍MySQL实现类似Oracle序列的方案,包括了MySQL实现类似Oracle序列的方案的使用技巧和注意事项,需要的朋友参考一下 MySQL实现类似Oracle的序列 Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的; 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、是否循环等

  • 问题内容: MySQL提供了一种自动增加记录ID的机制。这可以用于许多目的,但是我需要能够使用ORACLE提供的序列。显然,为此目的创建表是没有意义的。 解决方案应该很简单: 1)创建一个表以托管所有需要的序列, 2)创建一个增加特定序列的值并返回新值的函数, 3)创建一个返回序列当前值的函数。 从理论上讲,它看起来很简单…但是… 当增加一个序列的值时(与Oracle中的相同),您需要阻止其他会话

  • 问题内容: 我正在寻找像MySQL中那样的解析函数(有关更多信息,请参阅文档) 解析函数基于一组行来计算合计值。它们与集合函数的不同之处在于,它们为每个组返回多个行。 是否存在? 问题答案: 不,与MSDB,Oracle,PostgreSQL等其他DBMS相比,它是MySQL的主要不足之一。 我强烈怀疑将来是否会看到MySQL中的窗口函数,尤其是在Oracle收购MySQL之后。 更新04/201

  • 问题内容: Oracle的数据库链接允许用户查询多个物理数据库。 是否有任何MySQL等效产品?解决方法? 我想在两个表中运行联接查询,这两个表位于两个物理数据库中。在MySQL中可能吗? 问题答案: 我可以为您的方案考虑四种可能的解决方法: 查询 外部 表时,请使用完全限定的表名。MySQL支持-syntax访问当前数据库范围之外的表。这要求当前连接的用户具有从另一个物理数据库中的请求表中读取的