我有一个数据库表,其中包含用生成器创建的唯一记录号,但是由于代码(设置生成器)中的错误,记录号突然变大,因为跳过了许多数字。我想重写从1开始的所有记录号,并以总记录号结束。使用应用程序将花费很多时间。 从Firebird的文档中可以看到,使用循环应该是一个简单的任务,但是我没有Firebird编程的经验,我只使用简单的SQL语句,有人可以帮忙吗?
答案 0 :(得分:2)
实际上,不需要编程循环,简单的update
语句应该可以。首先,重置生成器:
SET GENERATOR my_GEN TO 0;
,然后更新为其分配新ID的所有记录
update tab set recno = gen_id(my_GEN, 1) order by recno asc;
它假定对recno
字段的所有引用都是通过带有ON UPDATE CASCADE
的外键进行的,否则您将弄乱数据或更新失败。
在此操作期间,数据库中应该没有其他用户!
话虽如此,您真的不应该在意记录数的差距。