【发布时间】:2018-08-06 07:11:50
【问题描述】:
我有一个数据库表,其中包含使用生成器创建的唯一记录号,但由于代码错误(设置生成器)记录号突然变大,因为跳过了许多数字。我想重写从 1 开始的所有记录号,并以总记录号结束。应用程序将花费大量时间。 正如我从 Firebird 的文档中看到的,使用循环应该是一个简单的任务,但我没有使用 Firebird 编程的经验,我只使用简单的 SQL 语句,有人可以帮忙吗?
【问题讨论】:
-
这是对生成器的滥用,它们旨在生成事务外数字,当事务回滚或不以插入结束时有间隙。 // 阅读 PSQL 教程,例如存储过程。您可以使用“EXECUTE BLOCK”运行它们,您需要声明内部整数变量,将其设置为零,并使用 begin-end 进行“for select ... order by ID-column as [named cursor name]”循环,在循环中,您将“更新 ... set ID-column = :local-ID-variable where current of [named cursor name]”,然后增加变量。
-
然后在提交之后你会将生成器移动到最大 ID。注意:它仍然需要很长时间,因为它实际上需要复制数据库中的整个表。在此处阅读相应的主题:firebirdsql.org/file/documentation/reference_manuals/… - 第 6 章为
SELECT(包括 FOR SELECT 和“作为游标”子句)和UPDATE ... WHERE CURRENT OF以及 PSQL 变量和循环(第 7 章)。 -
谢谢,我设法创建了执行块,但正如我在下一个解决方案中评论的那样,要复杂得多。无论如何,我学到了一些东西:)
标签: firebird firebird2.5