将唯一记录插入 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的主要内容,如果未能解决你的问题,请参考以下文章
MS Access 2007 - 导入表后,记录集不再可更新