【问题标题】:Inserting a value into a primary key field in Access在 Access 的主键字段中插入值
【发布时间】:2019-12-13 15:47:31
【问题描述】:

我有几个表需要包含“Null”值,因此如果另一个表链接到该特定记录,它基本上会得到“Nothing”。所有这些表都有不同数量的记录 - 如果我在最后粘贴一些东西,试图找到“Null”记录会变得混乱。因此,我想执行INSERT 查询来附加一条记录,该记录的 ID 字段值为 0,或为固定数字(如 9999999)。我都尝试过,但 Access 不允许我运行查询,因为密钥违规。

问题是,我之前运行过相同的查询,并且运行良好。但是后来我不得不删除所有数据并重新上传,现在我再次尝试,它不起作用。这是查询:

INSERT INTO [Reading] ([ReadingID], [EntryFK], [Reading], [NotTrueReading]) 
VALUES (9999999, 0, "", FALSE)

9999999 在哪里,我也试过 0。两个查询都因密钥违规而失败。

我知道这不是好的数据库设计。尽管如此,有没有办法使这项工作?我不知道为什么我现在不能这样做,而我以前可以这样做。

【问题讨论】:

  • ReadingID字段的数据类型是什么?
  • 试用:VALUES (9999999, 0, Null, FALSE)
  • @LeeMac 这是自动编号
  • @Gustav 我已经试过了,它似乎得到了同样的错误。

标签: sql ms-access insert ms-access-2016


【解决方案1】:

我不确定我是否完全理解这里的问题,但可能有几个原因导致这不起作用。最重要的是,对于查找表中的每条记录,任何类型的主键列都必须是唯一的。就像你上面提到的,0 是“未知”的一个很常见的值,所以我认为你走在正确的轨道上。

[阅读]中是否已经存在0或9999999?如果是这样,那可能是一种解释。当您之前清除表时,您是完全删除并重新创建表还是截断它?根据表的设置方式,如果您只是删除该表中的所有数据并重新插入它,而不是感谢删除并重新创建它(即,如果我在一个表中有 100 条记录,然后将其截断(或删除这些记录),下次我将一条记录插入该表时,它仍会从 101 作为其默认 PK 值开始)。

您可以做的一件事是删除并重新创建表并对其进行设置,以便主键由数据库本身生成(如果还没有)(也称为“身份”类型的列),并确保它从 0 开始。一旦你这样做了,你要插入的第一条记录就是你的“未知”值 (0),就像你让数据库本身处理 ReadingID 一样:

INSERT INTO [Reading] ([EntryFK], [Reading], [NotTrueReading]) VALUES (0, "", FALSE)

然后插入其余数据。如果查找 [Reading] 的另一个表在 FK 列中具有空值,那么您始终可以在 coalesce(fk_ReadingID,0) = Reading.ReadingID 上重新连接到 [Reading]。

希望在某些方面有所帮助。

【讨论】:

  • 我其实并没有直接删除表,而是从另一个表中删除了数据,并勾选了Referential Integrity和Cascade Delete,这样每条链接的记录都消失了。我刚刚运行了SELECT 查询以查看我之前插入的“0”记录是否仍然存在,但它不存在。所以我可能不得不将数据复制到一个新表中才能正常工作。
  • 所以我尝试手动插入一个新值,结果发现插入查询确实有效——只是没有显示。在 9999999 之后,下一个 PK 值达到 10000000。所以我猜我的问题已经解决了?
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 2016-09-22
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多