将唯一记录插入 MS access 2007

Posted

技术标签:

【中文标题】将唯一记录插入 MS access 2007【英文标题】:Inserting unique records into MS access 2007 【发布时间】:2013-02-19 10:18:27 【问题描述】:

所以我一直在环顾四周,并没有找到太多东西。我提前道歉,因为这可能是错误的做法,但事实就是如此。

所以我必须跟踪同事完成的课程。这是通过提供 MS 访问数据库的 Excel 表完成的。有 3 个字段提供给我。

全名、课程名称和完成日期。

我知道我在这里没有主键,所以我正在尝试创建一个查询,该查询只会附加从 Excel 表中提取的唯一记录。我可以基于单个字段执行此操作,但需要帮助使我的查询仅在全名和课程名称不相同时附加它,例如

Joe Somebody, Course#1, 14feb13

Joe Somebody, Course#2, 15feb13

Joe Somebody, Course#1, 15feb13

我需要一个查询,它将前 2 行附加到表中,但由于该人已经完成课程#1 而忽略第三行。这就是我目前所拥有的,基本上将我的姓名字段变成了主键。

INSERT INTO table [Full name], [Course], [Date]

SELECT excel_table.[Full name], excel_table.[Course], excel_table.[Date]

FROM excel_table

WHERE excel_table.[Full name] Not in (SELECT table.[Full Name] FROM table)

我最后也有一些 Is Not Null 的东西,但我认为这与问题无关。

【问题讨论】:

所以基本上你需要 (FullName, CourseName) 组合键。不确定如何在 MS Access 中工作,但对于 mysql,我创建了一个演示 sqlfiddle.com/#!2/8e17a/1。希望这会有所帮助 它确实有助于我认为我可以使用您的代码,只需对访问进行很少的调整。非常感谢! 【参考方案1】:

为了避免重复,最简单的方法是添加索引。在这种情况下,复合主键似乎就是答案。只需选择要包含在复合键中的所有字段,然后单击主键按钮:

在构成主键的任何字段中都不允许有空值,但只要字段组合不匹配,每个字段中的数据都可以重复。所以:

Joe Somebody, Course#1, 14feb13     <-- good
Joe Somebody, Course#2, 15feb13     <-- good
Joe Somebody, Course#1, 15feb13     <-- fails
Joe SomebodyElse, Course#1, 14feb13 <-- good

现在,如果您使用查询设计窗口运行普通的追加查询构建,如果该记录在 Excel 导入表中存在两次或已存在于 Access 中,则会出现错误:

【讨论】:

而且上面还允许多个同名的不同课程?反之亦然? 可以,只要两个字段的组合不同,都可以。不允许在任一字段中使用空值。 也谢谢你。猜猜我没有完全理解主键。我在想主键会使每个字段都是唯一的,而不是将它们组合起来。再次感谢:) 只需选择字段并单击主键按钮即可创建复合主键,您就走了:)【参考方案2】:

您实际上并不需要复合主键。事实上,在 Access 中的一些地方,我们鼓励您使用复合主键。您可以使用简单的整数主键创建 Access 表:

create table CourseCompletions (
  ID autoincrement primary key
, FullName varchar(100)
, CourseName varchar(100)
, CompletionDate date
);

然后你可以从 Excel 文件中吞下所有数据:

insert into CourseCompletions (
, FullName
, CourseName
, CompletionDate
) select
  [Full name]
, [Course]
, [Date]
from excel_table;

这将为输入 Excel 表的每一行提供一个唯一编号,并将其存储在 Access 表中。现在您需要决定如何拒绝 CourseCompletions 表中的冲突行。 (以下查询仅显示您决定拒绝的记录。)如果您想拒绝同一个人在以后完成同一课程:

select
  ID
, FullName
, CourseName
, min(CompletionDate)
from CourseCompletions
group by
  ID
, FullName
, CourseName;

如果您想拒绝提前完成,只需将 MIN 更改为 MAX。

如果您想拒绝 Excel 表格中早先出现的任何课程完成:

select
  cc1.ID
, cc1.FullName
, cc1.CourseName
, cc1.CompletionDate
from CourseCompletions as cc1
inner join (
  select
    max(ID) as WantedID
  , FullName
  , CourseName
  from CourseCompletions
  group by FullName, CourseName
) as cc2
on cc1.ID = cc2.WantedID;

若要拒绝稍后出现在 Excel 表格中的课程完成,只需将 MAX 替换为 MIN。

因此,使用整数主键为您提供了一些选择。

【讨论】:

以上是关于将唯一记录插入 MS access 2007的主要内容,如果未能解决你的问题,请参考以下文章

大型记录集 (VBA) 的 MS Access 插入慢

MS Access 如何计算过滤报告上的唯一记录或值

MS Access 2007 - 导入表后,记录集不再可更新

MS Access UPSERT(更新/插入)SQL [重复]

Access 2007 中的格式组合框

MS Access 2010 排名查询比较两列的唯一排名