【问题标题】:Why #Deleted in records from linked table?为什么在链接表的记录中#Deleted?
【发布时间】:2016-10-16 20:37:34
【问题描述】:

我的表位于如下定义的 SQL Server 上。将唯一约束添加到表中时,Access 数据输入表单会在刚刚输入的记录的所有字段中显示 #Deleted。我可以通过重新查询并强制创建新记录来解决这种情况。每个用户通常只有 1 - 3 条记录。

Requery
DoCmd.GoToRecord , , acNewRec

Data Entry Form

为什么添加唯一约束会干扰访问表单?该表单在没有唯一约束的情况下可以正常工作。

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


【解决方案1】:

根据 this article,表中的唯一字段是 Access 用于通过 ODBC 连接检索和更新记录的“键”。

具体来说,您的问题与 std_Create_ID 有关。 std_Create_ID 的默认值是使用 suser_sname() 函数在后端创建的。因此,从 Access 的角度来看,std_Create_ID 字段在创建记录时是一个空字符串(或可能为 null),因此唯一键是 [inv_loc]、[inv_no] 和一个空字符串(或可能为 null )。但是,一旦创建记录,这三个变量的组合就不再存在,因此根据文章假定记录已被删除。

根据文章和您在此处的操作方式,您当前的设置无法解决此问题。你说你继承了这一切,所以我不确定你能改变什么。但是,我看到了几个选项:

  1. 继续您的解决方法(即重新查询)
  2. 在 Access 中构建 std_Create_ID(这可能是不可能的)。
  3. 从表的唯一约束中删除 std_Create_ID。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多