【发布时间】:2016-10-16 20:37:34
【问题描述】:
我的表位于如下定义的 SQL Server 上。将唯一约束添加到表中时,Access 数据输入表单会在刚刚输入的记录的所有字段中显示 #Deleted。我可以通过重新查询并强制创建新记录来解决这种情况。每个用户通常只有 1 - 3 条记录。
Requery
DoCmd.GoToRecord , , acNewRec
为什么添加唯一约束会干扰访问表单?该表单在没有唯一约束的情况下可以正常工作。
CREATE TABLE [dbo].[tbl_INV_cust_inv_us_temp] (
[inv_loc] [char](3) NOT NULL,
[inv_no] [char](7) NOT NULL,
[std_GUID] [uniqueidentifier] NOT NULL,
[std_NewRecordInd] [bit] NOT NULL,
[std_Create_TS] [datetime] NOT NULL,
[std_Create_ID] [varchar](50) NOT NULL
);
GO
ALTER TABLE [dbo].[tbl_INV_cust_inv_us_temp]
ADD CONSTRAINT [DF_tbl_INV_cust_inv_us_temp_std_GUID]
DEFAULT (newid()) FOR [std_GUID];
GO
ALTER TABLE [dbo].[tbl_INV_cust_inv_us_temp]
ADD CONSTRAINT [DF_tbl_INV_cust_inv_us_temp_std_NewRecordInd]
DEFAULT (1) FOR [std_NewRecordInd];
GO
ALTER TABLE [dbo].[tbl_INV_cust_inv_us_temp]
ADD CONSTRAINT [DF_tbl_INV_cust_inv_us_temp_std_Create_TS]
DEFAULT (getdate()) FOR [std_Create_TS];
GO
ALTER TABLE [dbo].[tbl_INV_cust_inv_us_temp]
ADD CONSTRAINT [DF_tbl_INV_cust_inv_us_temp_std_Create_ID]
DEFAULT (right(suser_sname(),(len(suser_sname()) - 9))) FOR [std_Create_ID];
GO
ALTER TABLE [dbo].[tbl_INV_cust_inv_us_temp]
ADD CONSTRAINT [IX_tbl_INV_cust_inv_us_temp]
UNIQUE NONCLUSTERED (
[inv_loc] ASC,
[inv_no] ASC,
[std_Create_ID] ASC)
WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON )
ON [PRIMARY];
GO
【问题讨论】:
-
只是想知道:为什么这是唯一约束而不是主键? Access(或多或少)需要链接的 ODBC 表中的 PK 才能使用它。
-
我不确定这里 - 但使用包含 inv_loc 和 inv_no 的唯一索引 - 并且这些字段定义为 NOT NULL,如果没有设置默认值,您如何使用新记录加载它们?跨度>
-
像许多帖子一样,我继承了这个烂摊子。 std_GUID 上实际上有 PRIMARY KEY (PK) 和表上的 UNIQUE (U) 约束。我尝试了四种约束组合:0,0 - OK; 0,U - 失败; PK,0 - 好的; PK,U - 失败。我意识到这在功能上是多余的。主键为查找提供记录唯一性,而唯一性约束提供用户不输入重复记录。 Access 将 UNIQUE 约束视为 PK,并且在链接表时不会为您提供选择 PK 的对话框。记录通过 Access 数据输入表单(上面的链接)输入。
标签: sql-server tsql ms-access vba