2010-03-11 78 views
4

我有一个庞大的数据库(800MB),它包含一个名为'Date Last Modified'的字段,此字段作为文本数据类型输入时需要将其更改为一个日期/时间字段来执行一些查询。无法更改MS Access 2007上的数据类型

我还有一个完全相同的数据库,但它里面的数据只有35MB,当我改变它工作正常,数据类型,但是当我尝试在大型数据库的更改数据类型,它给了我一个错误:

Micorosoft Office Access can't change the data type. 

There isn't enough disk space or memory 

做一些研究更改注册表文件(MaxLocksPerFile)提到一些网站尝试过为好,但没有运气:-(

谁能帮助吗?

+0

您是否尝试过使用相同的字段创建一个新的表格,但'Date Last Modified'是datetime类型。这张新表不应该有任何索引。用附加查询将数据追加到新表中。 – Fionnuala 2010-03-11 23:51:57

+0

抱歉不太清楚你的索引是什么意思:s 数据是在我用来导入到Access的CSV文件中,它没有让我设置数据类型,然后在导入级别上也是同样的问题。 – 2010-03-12 00:02:11

+0

如果你不知道索引是什么,你可能没有一个:)请发布两个或三个日期来显示格式,谢谢。 – Fionnuala 2010-03-12 00:11:32

回答

1

一个比较繁琐(但简单明了)的解决方案是将大数据库分解成更小的数据库,在较小的数据库上进行转换,然后重新组合它们。

这有一个额外的好处,即如果在某个块中文本是无效的日期,那么它会更容易找到(因为块大小更小)。

假设你有某种对范围从1到(比方说)千万表整数关键的,你可以不喜欢

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语句。在我的情况下,因为我的查询只抓取值> = 0和< 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语句。如果你试图把在多条语句并运行它们,你会得到错误。这样跑第一个,然后删除它,然后运行第二个,等你应该罚款。我认为这会做到!我编辑了上述内容以使其更清晰。

+0

对不起,当谈到SQL时,我是一个新手的升技。我的表被称为'OutputIDrive'mykey是'ID',它的范围从0> 1325210我怎样才能把它放到SQL?我试着改变你的源代码,但在查询表达式'ID> = 0 AND ID <662605'中得到'语法错误'谢谢你的帮助。 – 2010-03-11 22:27:33

0

这是完全有可能在一个数据库后这个尺寸,你有文字数据不会转换为有效的日期/时间。

我会建议(你可能会讨厌我),你将所有这些预期的日期值从“Big”中导出,并通过它们(可能在Excel中)来查看哪些未按照您的期望格式化。

+0

够搞笑,我居然有! :( 数据库中的数据已经自动生成,并且全部都是日期类型 至于excel,起初我试图用Excel打开它,但Excel有最大数量的单元格,我想大约1.2百万,这个数据超过了:( – 2010-03-11 22:16:57

+0

)我可以建议你的数据从Access迁移到SQL Express或其他东西吗?这是一个疯狂的大量数据信任访问。 – 2010-03-11 22:28:13

+0

这将是一个好主意,但我是一个完整的新手当涉及到除Access之外的任何数据库时,但是如果将这个数据库转换为SQL的简单步骤将会很棒。 – 2010-03-11 22:30:35

0

假设错误消息是准确的,你对磁盘或存储限制跑起来。假设你有超过两磁盘驱动器上GB的更多,我最好的猜测是,重建表会把数据库(包括工作空间)在访问中每个文件限制2千兆字节。

如果这是你需要的情况下:

  1. 卸载数据到一些方便的格式,并与已经存在的表定义加载回一个空数据库。

  2. 移动数据的子集到一个较小的表,改变数据类型在较小的表,紧凑和修复数据库,并重复,直到所有的数据被转换。

如果错误消息不正确(这是可能的),最可能的原因是文本日期列中的错误或超出范围的日期。

0
  1. 复制表格(即'YourTable'),然后将其结构以不同的名称(即'YourTable_new')粘贴到数据库中。

  2. 将新表中的字段更改为所需内容并保存。

  3. 创建一个附加查询并将旧表中的所有数据复制到新的查询中。

希望Access会自动将旧文本字段直接转换为新日期/时间字段的正确值。如果不是,则可能必须清除旧表并重新附加所有数据,并在执行追加操作时使用字符串到日期函数来转换该字段。

此外,如果旧表中存在自动编号字段,则可能无法工作,因为无法确保旧的自动编号值与新分配的自动编号值对齐。

+0

咦?当然,您可以保留相同的自动编号值。只需将旧的自动编号字段附加到新的自动编号字段。 Jet/ACE自动编号数据类型只是一个具有特殊类型默认值的长整型字段(以及一些其他限制,例如创建记录后不可编辑),因此您可以将任何值附加到只要它不违反现有数据的索引,就可以创建新记录。 – 2010-03-12 18:29:29

0

您已经获得了一堆不同的方式来解决磁盘空间不足的错误消息。

你有没有尝试添加一个新的领域,以现有的表使用日期数据类型,然后用值现有的字符串日期字段更新领域?如果可行,则可以删除旧字段并将新字段重命名为旧名称。这可能会占用较少的临时空间,而不是直接从字符串到单个字段的日期转换。

如果仍然无法正常工作,您可以用两列,第一个长整型(使其主键),第二,日期与sceond表来做到这一点。然后将PK和字符串日期字段附加到此空表中。然后将新的日期字段添加到现有表中,并使用连接,使用两列表中的值更新新字段。

这可能会遇到同样的问题。它取决于我们无法控制的Jet/ACE数据库引擎内部数量。

1

我刚刚有这个问题。

磁盘空间和可用内存都很好。经过

问题就走了“压缩和修复”。

巧合?

e。

3

由于John W. Vinson says here,您遇到的问题是,Access想要在进行更改时保留表的副本,并导致它超出Access文件的最大允许大小。压缩和修复可能有助于获得文件大小的限制,但它不适合我。

如果像我一样,你有很多复杂的关系和旧表报告的,你不希望有重做,尝试,而不是对@ user292452的解决方案这种变化:

  1. 复制表格(例如'YourTable'),然后将Structure Only 粘贴到您的数据库中,使用不同的名称(即'YourTable_new')。
  2. 复制YourTable又和粘贴数据,追加到YourTable_new。 (要粘贴-追加,第一贴,并选择追加数据到现有 表。)
  3. 你可能想在这一点上,让您的Access数据库的副本, 以防万一出问题时的一个部分。
  4. 删除所有数据YourTable使用删除查询---选择所有 领域,使用星号,然后用默认设置运行。
  5. 现在,您可以根据需要在YourTable更改字段并再次保存 。
  6. 粘贴数据从YourTable_newYourTable,并检查 从类型转换,长度等没有错误。
  7. 删除YourTable_new
+1

在步骤5中,编辑*原始*表格,不是吗? – Andre 2016-02-03 17:21:05

+0

@安德鲁,谢谢---现在修好了。 – caedocyon 2016-04-20 16:39:30

1

Karl Donaubauer's answer上的MSDN交改编:

  • 切换到即时窗口(CTL + G)
  • 执行以下语句:

    DBEngine.SetOption dbMaxLocksPerFile,200000


微软有一个KnowledgeBase article直接解决这个问题,并介绍了原因:

The page locks required for the transaction exceed the MaxLocksPerFile value, which defaults to 9500 locks. The MaxLocksPerFile setting is stored in the Windows registry.

的知识库文章说,它适用于Access 2002和2003年,但它从一个.mdb更改字段时,工作对我来说Access 2013.

相关问题