我有一个超出所有修复损坏的Access数据库(不要问我怎么做,它是一个客户端数据库)。但是,我们可以使用.NET ODBC之类的代码访问数据。由于我们拥有数据库的干净副本,因此我们计划将所有数据从损坏的数据转移到新数据。
我们只有一个问题,那就是数据库包含自动注册和大量链接。当我们传输数据时,我们希望确保所有autonum id与之前完全相同。不过,我们最终会遇到更多问题。
有办法做到这一点吗?
由于
答案 0 :(得分:8)
许多人误解了Jet / ACE Autonumber字段。它实际上只是一个长整数字段,具有默认属性和一些特殊属性(例如非编辑性,每个表限制为一个)。
没有什么可以阻止您将现有值插入新的空表中。将保留自动编号值,因为在创建记录时,您提供了显式值,而不是依赖于默认值来填充字段。
唯一的问题是如果定义了引用完整性,在这种情况下,您必须按顺序执行追加,以便在子记录之前插入父记录,或者为插入删除RI,然后再将其放回。
我可能会做后者,因为我的代码可以将关系从一个数据库复制到另一个数据库,所以我只是保留作为备份模板。
最后,您需要确定导致损坏的原因并解决该问题。否则,你将来必须再次这样做。
答案 1 :(得分:2)
我不了解禁用自动编号。即使目标字段也是自动编号,您的新表也可以接受旧表中的自动编号值。在此示例中,id字段是两个表中的自动编号:
INSERT INTO tblFoo_new ( id, foo_text, date_assigned, parent_id )
SELECT old.id, old.foo_text, old.date_assigned, old.parent_id
FROM tblFoo AS old;
tblFoo_new是一个空表,在执行INSERT INTO语句之前压缩了数据库... compact“重置”自动编号计数器。
如果tblFoo_new开始时不为空,则执行可能失败。如果我从表中删除了行,但没有压缩以重置计数器,则相同。
您提到的链接有什么处理?他们如何适应这个?
答案 2 :(得分:1)
我相信ACCESS Select into会保持自动增量不变。之后,您可以继续使用干净的数据库。
答案 3 :(得分:0)
不确定是否可以禁用AutoNum。如果有帮助,您可以重置/调整它。