循环并更改Firebird数据库中的所有记录编号

循环并更改Firebird数据库中的所有记录编号,firebird,firebird2.5,Firebird,Firebird2.5,我有一个使用generator创建的具有唯一记录编号的数据库表,但由于代码错误(设置generator),记录编号突然变大,因为许多数字被跳过。我想重写所有记录编号,从1开始,以总记录编号结束。有了应用程序,这将需要很多时间。 正如我从Firebird的文档中看到的,使用循环应该是简单的任务,但我没有Firebird编程的经验,我只使用简单的SQL语句,有人能帮我吗?实际上没有必要编写循环,简单的更新语句就可以了。首先,重置发电机: SET GENERATOR my_GEN TO 0; 然后更

我有一个使用generator创建的具有唯一记录编号的数据库表,但由于代码错误(设置generator),记录编号突然变大,因为许多数字被跳过。我想重写所有记录编号,从1开始,以总记录编号结束。有了应用程序,这将需要很多时间。
正如我从Firebird的文档中看到的,使用循环应该是简单的任务,但我没有Firebird编程的经验,我只使用简单的SQL语句,有人能帮我吗?

实际上没有必要编写循环,简单的
更新
语句就可以了。首先,重置发电机:

SET GENERATOR my_GEN TO 0;
然后更新所有为其分配新id的记录

update tab set recno=gen\u id(my\u gen,1)由recno asc订购;
它假定对
recno
字段的所有引用都是通过外键在更新级联中使用
,否则会弄乱数据或更新失败

在此操作期间,数据库中不应有其他用户


也就是说,你真的不应该在意记录数字的差距。

实际上没有必要编写循环,简单的
update
语句就可以了。首先,重置发电机:

SET GENERATOR my_GEN TO 0;
然后更新所有为其分配新id的记录

update tab set recno=gen\u id(my\u gen,1)由recno asc订购;
它假定对
recno
字段的所有引用都是通过外键在更新级联中使用
,否则会弄乱数据或更新失败

在此操作期间,数据库中不应有其他用户


也就是说,您真的不应该关心记录编号中的空白。

这是对生成器的滥用,它们被设计为在事务编号之外生成,当事务回滚或以其他方式不以insert结束时,会有空白。//阅读PSQL教程,如存储过程。您可以使用“EXECUTE BLOCK”运行它们,您需要声明内部整数变量,将其设置为零,并使用begin end创建一个“for select…order by ID column as[named cursor name]”循环,在该循环中,您将“update…set ID column=:local ID variable where of cursor of[named cursor name]。”然后增加变量。在提交之后,您将把生成器移动到max ID。注意:这仍然需要很长时间,因为它实际上需要复制数据库中的整个表。阅读此处的相应主题:-第6章的
SELECT
(包括SELECT和“as cursor”子句)和
UPDATE。。。其中当前包含了
和PSQL变量和循环(第7章)。多亏了我,我成功地创建了执行块,但正如我在下一个解决方案中所评论的,它非常复杂。无论如何,我学到了一些东西:)这是对生成器的一种滥用,它们被设计为在事务数之外生成,当事务回滚或以其他方式不以insert结束时会有间隙。//阅读PSQL教程,如存储过程。您可以使用“EXECUTE BLOCK”运行它们,您需要声明内部整数变量,将其设置为零,并使用begin end创建一个“for select…order by ID column as[named cursor name]”循环,在该循环中,您将“update…set ID column=:local ID variable where of cursor of[named cursor name]。”然后增加变量。在提交之后,您将把生成器移动到max ID。注意:这仍然需要很长时间,因为它实际上需要复制数据库中的整个表。阅读此处的相应主题:-第6章的
SELECT
(包括SELECT和“as cursor”子句)和
UPDATE。。。其中当前包含了
和PSQL变量和循环(第7章)。多亏了我,我成功地创建了执行块,但正如我在下一个解决方案中所评论的,它非常复杂。无论如何,我学到了一些东西:)这是一个优雅的解决方案,但在我看来,任何解决方案都是复杂的,因为我需要删除所有约束,包括主键,这是不可能的,因为它用于外键定义。。。不管怎样,正如你所说的,最好还是保持现状。我担心整数大小(当前记录数超过10000),但我还有时间,直到2147483647达到:)现在,当我想到它时,你不能以随机顺序更新它们,记录必须以“当前id顺序”更新,即
更新。。。按recno asc订购
。通过这种方式,您不会试图分配一个仍在使用的新id(因此失败),即如果您有记录id 1、3,。。。然后,首先更新会将1分配给记录1(即无更改),然后将2分配给记录3,依此类推。@Danxy也许您可以将FK约束改为级联约束。但是,再一次,这是对发电机概念的滥用。。。还有关于应用程序外引用的问题。就像你的雇主给另一名员工写电子邮件谈论“文档12345”。一周后,有人删除了文档12200-12250,突然引用的文档被重新编号为12295。然后,员工2阅读电子邮件(甚至是纸质蜗牛邮件),打开文档#12345,却不知道它与不相关的另一个文件一起工作。我按日期列订购。Arioch,我不希望有这样的问题,因为关系表刚刚添加,在项目中是新的。。。好吧,如果我有额外的时间(这几乎是不可能实现的愿望:)@Danxy如果您担心整数大小,我会建议您采取措施切换到使用
BIGINT
(尽管这将更加复杂,不仅仅是重新编号)。这是一个优雅的解决方案,但在我的例子中,似乎任何解决方案都很复杂,因为我需要删除所有约束,包括主键,这是不可能的,因为它用于外键定义。。。不管怎样,正如你所说的,最好还是保持现状。我担心整数si