Excel 文件数据库中的主键约束和自动增量

问题描述 投票:0回答:6

我使用Excel文件作为数据库,我想将ID列设置为主键,并在数据库中插入新记录时自动递增该列的值。

sql database vba excel
6个回答
2
投票

TL:博士;

你不能。 Excel 不是数据库管理系统。

可能的替代方案

您可以使用 MS Access 轻松地在 Excel 中复制和粘贴,甚至设置计划导入,大多数(如果不是全部)Windows 版 MS Office 都附带了 MS Access。这将为您提供您正在寻找的 DBMS 特定功能。

只需在 Access 中创建一个表,保留第一列

ID
不变,然后在其他列中粘贴/导入数据。
ID
列默认已经有PK和自动增量了。


您还可以使用更“完整”的免费 DBMS,例如 MS SQL Server ExpressMySQLPostgreSQL


0
投票

根据上面的评论,Excel 不是执行此操作的工具,但是,如果您愿意,您可以添加一个论坛来执行此操作。 查看这篇文章


0
投票

以下是使用 Excel 自定义验证创建主键以防止 Excel 单元格中出现重复条目的步骤。

1)选择整个空列(没有输入的列)。

2) 转到数据>>数据验证

3) 从允许下拉列表中选择自定义

4) 将

=COUNTIF($A:$A,A1)=1
粘贴到公式字段中。

现在,您的列设置了主键,这意味着从 A1 开始到 A 列的整个范围的每个单元格仅允许唯一值,如下所示。

enter image description here

所以现在如果您想在该 Excel 单元格中放入两个相同的值,则会出现以下错误:-

enter image description here

编辑:- 使用 Excel 列的标题选择行。请参见下图中的红圈,单击此处选择 Excel 中的整列。然后从上述步骤的第2步开始进行操作

enter image description here


0
投票

我只能通过自动增量来帮助你;)

看一下下面的 VBScript 代码,只需运行 SELECT 找出 ID 列的最后一个值,然后运行另一个 SQL 命令以使用 (LastValue+1) 插入新行。

Dim Conn, RS
Set Conn = CreateObject("ADODB.Connection")
Conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""D:/YourFile.xlsx"";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=0;"";" 'Use "IMEX=0" to be able to UPDATE. 
Conn.Open
Set RS = Conn.Execute("SELECT MAX([Id]) AS LastID FROM [Sheet1$A1:E10] ")
Conn.Execute("INSERT INTO [Sheet1$A1:E10] ([Id], [Field1], [FieldN]) VALUES ('" & CStr(Abs(RS("LastID")) + 1) & "', 'Some value', 'Another value')")
RS.Close
Conn.Close
Set RS = Nothing
Set Conn = Nothing

0
投票

我正在利用 Excel 的表格格式并将其与
的建议结合起来 @马蒂厄·吉登 @HaveNoDisplayName @贝尔戈·德·阿尔梅达

您可以通过主页>格式化为表格将数据设置为表格。 像这样,任何公式都会自动填充到表底部的任何新条目。 format as table

现在您可以按照 @Mathieu Guindon 的建议设置主键:

=ROW()-1

或者,如果您想要一个更神秘的密钥,您可以使用随机数,如 @Bergo de Almeida 所希望的那样:

=RAND()

但是,使用它作为主键,需要您将公式计算设置为手动,因为即使您不编辑相关单元格,该功能也会自动更新随机数。 为此,您必须将“公式”>“计算选项”设置为:

Manual

calculation options to manual

此外,如果 Excel 多次生成相同的随机数,您可以应用 @HaveNoDisplayName 建议的验证规则来引发错误。

这是公式的另一种语法 - 有时逗号和分号会造成混淆:

=COUNTIF($A:$A;A1)=1

这应该让您尽可能接近 Excel 中的主键。 demo


-2
投票

我想,如果 MS-Excel 能够生成随机数并将其固定在单元格上,那就太好了。就像,如果我可以修复一个随机数加上 now() 公式的结果作为连接文本,问题就会得到解决。我看到了一些在 VBA 上做到这一点的提示,但并不是真正按照伙伴要求的那样。

© www.soinside.com 2019 - 2024. All rights reserved.