【问题标题】:How do I 'DROP' and unamed relationship/constraint in MS Access with SQL?如何使用 SQL 在 MS Access 中“删除”和未命名的关系/约束?
【发布时间】:2010-08-12 14:31:10
【问题描述】:

我有一个 Microsoft Access 数据库,我有两个表。 Table1 有一个主键,Table2 有一个引用 Table1 主键的​​外键。此关系在 MS Access 的关系查看器中设置和查看,选中“强制引用完整性”复选框,连接类型为内部连接。关系是:

[Table1]--1---------N--[Table2]

我需要能够通过 SQL“删除”这个关系/约束。我该怎么做呢?我没有此关系/约束的名称,因为它是在 Access 中手动设置的,而不是使用 SQL。有没有办法做我需要做的事?

【问题讨论】:

    标签: sql ms-access constraints


    【解决方案1】:

    确定关系使用

    选择 szRelationship FROM Msysrelationships WHERE szObject = 'childtablename' 和 szReferencedObject = '父表名'

    那么

    使用 ALTER TABLE 命令。类似的东西

    ALTER TABLE Table2 DROP CONSTRAINT Relation1

    【讨论】:

    • 问题是“Relation1”将是约束的名称。正如我所提到的,我的约束没有名称,也不知道如何找到它。此外,当我使用任一表运行此语句时,它会显示“CHECK 约束 'Relation1' 不存在。”
    • 试试这个找出约束名称是什么 SELECT szRelationship FROM Msysrelationships WHERE szObject = 'childtablename' and szReferencedObject = 'parenttablename'
    【解决方案2】:

    要删除以 GUID 命名的关系,因为在关系窗口中创建的关系被命名,您需要使用方括号,如下所示:

    ALTER TABLE TableName 
    DROP CONSTRAINT [{0992AADA-3921-4AC0-8E95-745A87709D91}]
    

    使用系统表MsysRelationships查找关系名称并不难,列是:

    ccolumn
    grbit
    icolumn 
    szColumn    
    szObject    
    szReferencedColumn  
    szReferencedObject  
    szRelationship
    

    在您的情况下,名称将是一个 GUID,例如 {A869FC34-81AF-4D29-B81D-74180BF73025}

    您还可以使用 VBA 和 ADO 架构来列出关系。

    如果您想说出您可以使用什么,建议一种合适的方法来获取名称会更容易。

    在 VBA 中编辑

    Sub ListRelations()
    Dim rel As DAO.Relation
    
    For Each rel In CurrentDb.Relations
        Debug.Print rel.Name
        Debug.Print rel.ForeignTable
        Debug.Print rel.Table
        For Each fld In rel.Fields
            Debug.Print fld.Name
        Next
    Next
    End Sub
    

    【讨论】:

    • @Remou:要更改约束,我必须使用 SQL,但要获得名称,我可以使用我需要的任何资源。我的工作机器上有一个数据库副本,但真正的数据库在我只能通过 SQL 访问的生产服务器上。
    • 那应该很简单,我已经为 VBA 添加了一个注释。
    • 感谢您的建议。使用 SQL 更容易完成,但我感谢您的帮助。
    • 本答案第一部分中提到的系统表可以使用 SQL 访问,如 Mowgli 现在所示。
    • 我已经对此进行了更仔细的研究,并且不认为找到名称会解决您的问题。
    【解决方案3】:

    如果您可以在关系查看器中看到它,您可以单击它并从那里将其删除。

    【讨论】:

    • 我只能通过 SQL 访问实时数据库。我在本地工作机器上有一个副本,但最终只能使用 SQL 来实现我需要的。
    【解决方案4】:

    在 Visual Studio 服务器资源管理器中探索表我能够选择未命名的约束并将其删除(如 @Beth 建议的那样)。值得注意的是,VS 生成的脚本名称为:

    GO
    ALTER TABLE [dbo].[Organizations] DROP CONSTRAINT [FK__OrgDes__Langu__20C1E124];
    

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2013-08-22
      • 2013-01-03
      • 2014-04-04
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多