Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
Sql 如何更改db序列起始值_Sql_Oracle - Fatal编程技术网

Sql 如何更改db序列起始值

Sql 如何更改db序列起始值,sql,oracle,Sql,Oracle,我的要求如下。 (a) 我已经创建了一个序列,其中一个表是(假设雇员有id、姓名等)。 (b) 我的序列是如何损坏的,并且序列的当前值与employee表的id列的最大值不同步 现在,我想将序列重置为employee表的id列的最大值。我知道,通过使用PL/SQL存储过程,我们可以很容易地做到这一点。但我想写一个简单的查询,它将完成以下任务。 1-获取id的最大值和我的序列的当前值。获取一个差值,并使用递增方式将该差值添加到序列中。(此处我的序列当前值小于id列的最大id值)您可以使用“ALT

我的要求如下。 (a) 我已经创建了一个序列,其中一个表是(假设雇员有id、姓名等)。 (b) 我的序列是如何损坏的,并且序列的当前值与employee表的id列的最大值不同步


现在,我想将序列重置为employee表的id列的最大值。我知道,通过使用PL/SQL存储过程,我们可以很容易地做到这一点。但我想写一个简单的查询,它将完成以下任务。
1-获取id的最大值和我的序列的当前值。获取一个差值,并使用递增方式将该差值添加到序列中。(此处我的序列当前值小于id列的最大id值)

您可以使用“ALTER sequence”命令更改序列的值

要使用新的基值重新启动序列,需要删除并重新创建它

我认为用一个简单的SELECT查询无法做到这一点


。这将使序列的增量达到您当前拥有的最高ID的倍:

select your_sequence.nextval
from (
  select max(id) as max_id
  from your_table
) t
connect by level < t.max_id;


如果现有的ID值较低,第二个可能会做更多的工作,但如果值较高,您可以看到第二个会有一点自己的功能。

取决于您使用的是哪个数据库管理系统、sqlserver、mysql还是其他什么?您想重置它一次,还是每次插入记录时都要查找最大的ID?@笔名,因为OP询问,我认为可以放心地假设他是这个意思。@Mureinik哦,哎哟,完全错过了,我将删除讨论tsql的答案,谢谢!这可能会有帮助:谢谢你的回复,但我有以下问题,而使用这种方法。1-在第一种方法中,问题如下所示。(例如:当前顺序。当前值=12,最大id=20。理想情况下,应将当前值设置为20,但根据分析,发现as级别值从1 so条件开始(1@SaurabhGupta-想要将序列设置为20意味着您不希望ID中有间隙,但序列无论如何都不是无间隙的,因此我不确定为什么会“失败”。在这两种情况下,序列可能最终高于旧的最大ID(在第一个版本中可能要高得多;在第二个版本中为2*缓存大小)。对于这些值,第一个值以30结束,第二个值以31结束。不确定“我只能更新单个值”是什么意思,因为connect by.1仍然多次调用nextval。让我们以Seq.currval=12 Max(id)为例=20现在,如果我继续第一种方法,那么我们已经指定条件为connect bylevel@SaurabhGupta-如果您要求没有gap,那么我不认为您可以在单个SQL语句中实现,因为您可以使用currval/nextval的位置受到限制。除非您可以使用函数来查找下一个值,但它不是clear如果允许的话。如果这是一次性调整,那么不清楚您为什么不使用PL/SQL;如果这是一个您将多次执行的操作,则表明您的数据模型存在问题-如果“损坏”不是一次性的。
select your_sequence.nextval
from (
  select max(id) as max_id
  from your_table
) t
connect by level <= (
  select t.max_id + us.cache_size + 1 - us.last_number
  from user_sequences us
  where sequence_name = 'YOUR_SEQUENCE'
);