我有一个庞大的数据库(800MB),其中包含一个名为“Date Last Modified”的字段,此字段作为文本数据类型输入,但需要将其更改为日期/时间字段以执行某些查询
我有另一个完全相同的数据库,但其中只有35MB的数据,当我更改数据类型时它工作正常,但当我尝试更改大数据库上的数据类型时,它给了我一个错误:
Micorosoft Office Access can't change the data type.
There isn't enough disk space or memory
在做了一些研究之后,一些提到改变注册表文件的网站(MaxLocksPerFile)也试过了,但没有运气: - (
有人可以帮忙吗?
答案 0 :(得分:3)
作为John W. Vinson says here,您遇到的问题是Access希望在进行更改时保留表的副本,这会导致它超出Access文件的最大允许大小。压缩和修复可能有助于使文件达到大小限制,但它对我没有用。
如果像我一样,您在旧桌面上有很多复杂的关系和报告,并且您不想重做,请尝试在@ user292452的解决方案中使用此变体:
'YourTable'
),然后再粘贴“仅结构”
使用其他名称(即'YourTable_new'
)进入您的数据库。YourTable
,然后将数据粘贴到YourTable_new
。
(要粘贴 - 附加,首先粘贴,然后选择“将数据附加到现有”
表。)YourTable
中的所有数据---全选
字段,使用星号,然后使用默认设置运行。YourTable
中的字段并保存
试。YourTable_new
附加到YourTable
,然后检查
从类型转换,长度等没有错误YourTable_new
。答案 1 :(得分:1)
一个相对繁琐(但直截了当)的解决方案是将大型数据库分解为较小的数据库,在较小的数据库上进行转换,然后重新组合它们。
这有一个额外的好处,如果某个机会,文本在一个块中是无效的日期,它将更容易找到(因为较小的块大小)。
假设您在表上有某种整数键,范围从1到(比方说)10000000,您可以执行类似
的查询SELECT *
INTO newTable1
FROM yourtable
WHERE yourkey >= 0 AND yourkey < 1000000
SELECT *
INTO newTable2
FROM yourtable
WHERE yourkey >= 1000000 AND yourkey < 2000000
等
确保单独输入和运行这些查询,因为如果您尝试一次运行多个查询,Access似乎会给您一个语法错误。
如果你的密钥是别的东西,你可以做同样的事情,但你必须对你的WHERE条款更加棘手。
当然,最后要考虑的是,如果你可以解决它,那就是迁移到一个功能更强大的不同数据库。我猜你有理由认为这并不容易,但是你所谈论的数据量很多,你可能会遇到其他问题以及继续使用Access。
修改强>
由于你仍然遇到一些麻烦,这里有一些更详细的信息,希望你能看到我之前没有描述的东西:
在这里,您可以看到我创建了一个类似于您所描述的表“OutputIDrive”。我有一个ID标签,但我只有三个条目。 alt text http://www.freeimagehosting.net/uploads/2829dbd2d3.png
在这里,我创建了一个查询,进入了SQL模式,并输入了相应的SQL语句。在我的情况下,因为我的查询只抓取值&gt; = 0和&lt; 2,我们只得到一行...... ID = 1的那一行。 alt text http://www.freeimagehosting.net/uploads/16e6e0dbc2.png
当我点击“运行”按钮时,我会看到一个弹出窗口,告诉/警告我将要发生什么......它会将一行放入新表中。这很好......这就是我们正在寻找的东西。我点击“确定”。 alt text http://www.freeimagehosting.net/uploads/319e58d763.png
现在我们的新表已经创建,当我点击它时,我们可以看到ID = 1的一行数据已被复制到这个新表中。
alt text http://www.freeimagehosting.net/uploads/f7fd0aad82.png
现在,您应该只需修改SQL查询中的表名和数值,然后再次运行它。
希望这可以帮助你解决任何问题。
编辑2:
啊哈!这是诀窍。您必须在Access中一次输入和运行一个SQL语句。如果您尝试将多个语句放入并运行它们,您将收到该错误。所以运行第一个,然后擦除它并运行第二个,等等,你应该没事。我想会做到的!我编辑了以上内容以使其更清晰。
答案 2 :(得分:1)
我刚遇到这个问题。
磁盘空间和可用内存都很好。
问题在“紧凑和修复”之后消失了。
巧合?
例如
答案 3 :(得分:1)
改编自MSDN帖子的Karl Donaubauer's answer:
执行以下声明:
DBEngine.SetOption dbMaxLocksPerFile,200000
Microsoft有KnowledgeBase article直接解决此问题并描述原因:
事务所需的页锁超过MaxLocksPerFile值,默认为9500锁。 MaxLocksPerFile设置存储在Windows注册表中。
知识库文章说它适用于Access 2002和2003,但是当从Access 2013更改.mdb中的字段时,它对我有用。
答案 4 :(得分:0)
完全有可能在这个大小的数据库中,你有文本数据不能转换为有效的日期/时间。
我建议(你可能会因此而讨厌我)你从“Big”中导出所有这些预期日期值并通过它们(可能在Excel中)来查看哪些未按您期望的格式进行格式化。
答案 5 :(得分:0)
假设错误消息准确无误,则表示您正在运行磁盘或内存限制。假设您的磁盘驱动器上有超过几千兆字节的空闲时间,我最好的猜测是重建表会使数据库(包括工作空间)超过Access中每个文件限制2千兆字节。
如果是这种情况,您需要:
将数据卸载为一些方便的格式,并将其重新加载到具有已存在的表定义的空数据库中。
将数据的子集移动到较小的表中,更改较小的表中的数据类型,压缩并修复数据库,然后重复,直到转换完所有数据。
如果错误消息不正确(可能),最可能的原因是文本日期列中的错误或超出范围的日期。
答案 6 :(得分:0)
复制表格(即“YourTable”),然后将其结构仅使用不同的名称(即“YourTable_new”)粘贴回数据库。
将新表格中的字段更改为您想要的内容并保存。
创建追加查询并将旧表中的所有数据复制到新表中。
希望Access会自动将旧文本字段直接转换为新日期/时间字段的正确值。如果没有,您可能必须清除旧表并重新附加所有数据并使用字符串到日期函数来在执行追加时转换该字段。
此外,如果旧表中存在自动编号字段,则这可能不起作用,因为无法确保旧的自动编号值将与分配的新自动编号值对齐。
答案 7 :(得分:0)
您已经获得了许多不同的方法来绕过磁盘空间错误消息。
您是否尝试使用日期数据类型向现有表格添加新字段,然后使用现有字符串日期字段的值更新字段?如果可行,则可以删除旧字段并将新字段重命名为旧名称。这可能比在单个字段上从字符串到日期的直接转换占用更少的临时空间。
如果它仍然不起作用,您可以使用包含两列的sceond表,第一个长整数(使其成为主键),第二个,日期。然后将PK和字符串日期字段附加到此空表。然后向现有表添加新的日期字段,并使用连接,使用双列表中的值更新新字段。
这可能会遇到同样的问题。这取决于我们无法真正控制的Jet / ACE数据库引擎内部的数量。